我是否知道使用AND或EXIST通过复合外键选择2个表是否有任何区别?
AND示例:
SELECT comp1, comp2
FROM TABLE1
WHERE comp1 = ( SELECT comp1 FROM TABLE2 )
AND comp2 = ( SELECT comp2 FROM TABLE2 );
EXISTS示例:
SELECT comp1, comp2
FROM TABLE1
WHERE EXISTS( SELECT *
FROM TABLE2
WHERE TABLE1.comp1 = TABLE2.comp1
and TABLE1.comp2 = TABLE2.comp2);
感谢。
答案 0 :(得分:4)
即使=
更改为IN
运算符,第一个也不正确,因为您正在比较各个值而不是值的组合。
使第一个正确,你需要重新编写为:
select comp1, comp2
from table1
where (comp1, comp2) IN (select comp1, comp2 from table2);
考虑以下示例:
insert into table1 (comp1, comp2) values (1,2);
insert into table1 (comp1, comp2) values (2,1);
insert into table1 (comp1, comp2) values (1,1);
insert into table1 (comp1, comp2) values (2,2);
insert into table2 (comp1, comp2) values (1,1);
insert into table2 (comp1, comp2) values (2,2);
您的第一个语句(使用IN
而非=
时)将返回table1中的所有行,这显然不正确。如果要比较两个值的组合,那么我的语句只能正确返回table1中的两行。
这是一个SQLFiddle示例:http://sqlfiddle.com/#!4/e3c7a/1
答案 1 :(得分:1)
在第一种情况下,如果出现以下情况,您将收到错误:
SELECT comp1 FROM TABLE2
SELECT comp2 FROM TABLE2
会给你超过1个值;可能它会。
当结果集行数大于0时,EXISTS为true,因此第二个看起来正确。