它可以通过使用IN()
是需要比较多列值的多个组合时非常方便:
SELECT * FROM YourTable
WHERE (col1,col2) IN((1,2),(2,3),(4,4)...)
相反的:
SELECT * FROM YourTable
WHERE (col1 = 1 and col2 = 2) OR
(col1 = 2 and col2 = 3) OR
(col1 = 4 and col2 = 4) OR
....
审查两个查询的执行计划后,我可以说在Oracle中(使用IN()
这基本上是相同的),优化程序以相同的方式进行评估,并且都使用索引:
个
独立的条件:
EXPLAIN PLAN FOR
SELECT * FROM dim_remedy_tickets_cache t
where t.tt_id = '1' and t.region_name = 'one';
6 | 0 | SELECT STATEMENT | | 1 | 311 | 30 (0)| 00:00:01 |
7 | 1 | TABLE ACCESS BY INDEX ROWID| DIM_REMEDY_TICKETS_CACHE | 1 | 311 | 30 (0)| 00:00:01 |
8 | 2 | INDEX RANGE SCAN | DIM_REMEDY_TICKETS_HISTORYPK | 1 | | 20 (0)| 00:00:01 |
组合条件:
EXPLAIN PLAN FOR
SELECT * FROM dim_remedy_tickets_cache t
where (t.tt_id,t.region_name) in (('1','one'))
6 | 0 | SELECT STATEMENT | | 1 | 311 | 30 (0)| 00:00:01 |
7 | 1 | TABLE ACCESS BY INDEX ROWID| DIM_REMEDY_TICKETS_CACHE | 1 | 311 | 30 (0)| 00:00:01 |
8 | 2 | INDEX RANGE SCAN | DIM_REMEDY_TICKETS_HISTORYPK | 1 | | 20 (0)| 00:00:01 |
我承担所有RDBMS将评估该查询相同。
行构造函数在其他上下文中是合法的。例如,下面的两个语句是语义上等同(并以同样的方式通过优化的处理):
所以:
缺点 - 可能是一些人的可读性,但基本没有缺点。
优点 - 更少的代码,以及多列相比,在使用IN()
组合:
优点。减少打字。缺点。我认为不能使用索引 - 但我不确定 - 容易通过第一次测试 – Strawberry
进行验证'EXPLAIN'告诉我在两个查询中都使用了相同的索引,似乎这里没有任何区别 –
我认为如果where子句更复杂,则第一个语法不太清楚。 –