按复合外键选择

时间:2013-11-03 11:06:23

标签: sql oracle

我是否知道使用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);

感谢。

2 个答案:

答案 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,因此第二个看起来正确。