在Oracle数据库中,是否有一些正当理由要优先考虑通用查询,即由连接表表示的过滤条件,而不是具有大量元素(几百个)的IN条件的过滤器。我的意思是,如果你能写出像
这样的东西SELECT .... FROM t1 在哪里t1。 IN(......)有100-200项
或者如果最好用
更改它SELECT .... FROM t1 在t1上加入t2。 = T2。
其中t2表包含过滤器所需的值
非常感谢感谢您的回答
我试着解释一下情况和我的疑问 我有一个用户界面,用户可以在控件中选择许多项目(例如,一个或多个人的专业人员列表)。 我可以直接使用这个列表在IN条件下添加它,即 SELECT .... FROM t1 WHERE t1。 IN(p1 ... p200) 但是这个解决方案可能会引发一些问题: - 如果所选项很多,那么字符串可以超过sql字符串的限制(我记得在Oracle中存在4000字节的限制) - 具有许多值的IN条件可能效率低下
所以替代解决方案可以 1.使用所选项创建临时表 2.使用temparary表和主表之间的连接
通常临时表的填写速度很快,我的问题是第二个解决方案是否比第一个更有效
答案 0 :(得分:1)
这两个查询在功能上并不相同,所以这个问题有点奇怪 - 我无法想象这会经常出现(如果有的话)。
也就是说,如果你的表中包含了需要过滤的行,那么JOIN将是一种更自然/标准的处理方式。
第一个示例中的想法是查询t2以获取所有值,然后将它们添加到集合并生成IN子句吗?如果是这样,我会说这将是一个非常糟糕的做法。
答案 1 :(得分:1)
从我看来,有两个不同的问题。
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)Join vs IN的选择:
这真的无关紧要。 oracle执行的最终查询将是查询的转换版本,在两种情况下都可以评估相同的查询。
您应该看到两个查询中的哪一个更容易阅读并正确传达意图。
有用的链接:http://explainextended.com/2009/09/30/in-vs-join-vs-exists-oracle/
答案 2 :(得分:0)