连接与明确的条件

问题描述:

是否有一些合理的原因,在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/