0

複合外部キーで 2 つのテーブルを選択するために AND または EXIST を使用することに違いがあることを知っていますか?

および例:

SELECT comp1, comp2 
FROM TABLE1 
WHERE comp1 = ( SELECT comp1 FROM TABLE2 ) 
  AND comp2 = ( SELECT comp2 FROM TABLE2 );

存在する例:

SELECT comp1, comp2 
FROM TABLE1 
WHERE EXISTS( SELECT * 
              FROM TABLE2 
              WHERE TABLE1.comp1 = TABLE2.comp1 
                and TABLE1.comp2 = TABLE2.comp2);

ありがとう。

4

2 に答える 2

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 からすべての行を返します。2 つの値の組み合わせを比較している場合、私のステートメントは table1 から 2 行だけを正しく返します。

SQLFiddle の例を次に示します: http://sqlfiddle.com/#!4/e3c7a/1

于 2013-11-03T11:25:59.030 に答える
1

最初のケースでは、次のいずれかの場合にエラーが発生します。

SELECT comp1 FROM TABLE2
SELECT comp2 FROM TABLE2

複数の値が得られます。おそらくそうなるでしょう。

EXISTS は、結果セットの行数が 0 を超える場合に true になるため、2 番目が正しいように見えます。

于 2013-11-03T11:08:56.493 に答える