连接与明确的条件
是否有一些合理的原因,在Oracle数据库中,喜欢在通用查询中使用由连接表表示的过滤条件,而不是具有大量元素的IN条件的过滤器(几百个)。我的意思是,如果你可以写类似连接与明确的条件
SELECT ....从t1 WHERE t1。 IN(......)100-200项目
,或者如果它是更好地与
SELECT改变它....从T1 JOIN T2在T1。 = T2。
在T2表包含所需过滤器的值
千恩万谢
感谢您的答案
我试图解释的情况和我的疑问 我有一个用户界面,用户可以在控件中选择多个项目(例如一个或多个人员的专业列表)。 我可以直接使用这个列表在IN条件下添加这个,也就是 SELECT .... FROM t1 WHERE t1。 IN(p1 ... p200) 但是这个解决方案可能会引发一些问题: - 如果选择的项目很多,那么字符串可以超过sql字符串的限制(我记得在Oracle中存在4000字节的限制) - 与许多IN条件valuesmay是低效
所以替代的解决方案可以是 1.创建一个临时表使用所述temparary表和主表
一般之间的连接所选择的项目 2.临时表的填充是快速的,我的问题是如果这第二个解决方案是更有效率的第一个
这两个查询在功能上并不相同,所以这个问题有点奇怪 - 我无法想象这经常会出现(如果有的话)。这就是说,如果你有一个表格中包含了需要过滤的行,那么一个JOIN将是一个更自然/标准的处理方法。
第一个示例中的想法是查询t2获取所有值,然后将它们添加到集合并生成IN子句?如果是这样,我会说这将是一个非常糟糕的做法。
从我看来,有两个不同的问题。
a)使用静态列表/表。
如果(100-200)项目列表是一个静态值的列表,例如,让我们说一个国家或货币的列表,我认为最好将它添加到静态表/参数表并更改该查询使用该表来代替。如果您以后需要跟踪新的代码/国家等,则您稍后需要执行的操作是在查找表中插入一个新代码。另外,如果还有其他查询使用相同的条件(并且通常有),则此查找表将促进重用。
select * from t1 where id in (select id from t2);
and
select * from t1,t2
where t1.id = t2.id
都等同和优于
select * from t1 where
id in ('USD','EUR'.....); -- 100 to 200 items to track.
B)加入VS在的选择:
这真的无关紧要了很多。 oracle执行的最终查询将是您的查询的转换版本,在这两种情况下,查询可能会计算相同的查询。
您应该看看哪两个查询更容易阅读并正确传达意图。
有用的链接:http://explainextended.com/2009/09/30/in-vs-join-vs-exists-oracle/