【发布时间】:2012-03-27 01:30:48
【问题描述】:
我有一个不是很复杂但足够混乱的 sql,我质疑我有一个等价的或巧合的计数是相同的。
SQL1:
SELECT a, b
FROM table1
WHERE NOT EXISTS(
SELECT a, c
FROM TABLE2
WHERE table2.a != table1.a)
SQL2
SELECT table1.a, table1.b
FROM table1
LEFT JOIN table2 ON table2.a = table1.a
WHERE table2.a IS NULL
两者的计数相同,但不确定这是否是偶然的,我想确保转换不会改变原始功能。
【问题讨论】:
-
不确定我是否获得了 SQL1 的功能。您想从 table1 中获取 a、b,其中 a 是 table2.a 的唯一值?
-
我认为关键是从table1中获取table2中没有对应条目的行。
-
@Dave 是的,我认为这是最初的预期目的。但我不能 100% 确定,我正在尝试对其进行优化,使其运行得更快。
-
第一个查询的编写方式似乎是从 table1 获取所有行,这样 table2 中不存在不匹配的行。而且我认为只有 all table2 中的行与 table1.a 的 one 值完全匹配时才有效
-
@Churk,你没有提到你正在使用什么 RDBMS。我在 Oracle 中尝试了这两种语句,我发现如果 table2 上有一个索引,WHERE EXISTS 版本将使用索引,但带有 != 的连接条件(如下所示)不会。换句话说,假设一个索引,至少在 Oracle 中,你最好使用 NOT EXISTS。但是,您当然不需要在子查询中使用“SELECT a,c”;您可以只使用“SELECT 1”或“SELECT 'X'”。
标签: sql join left-join inner-join not-exists