0

表A、表B、および表Cの3つのテーブルがあるとします。

表Aには、エントリ1、2、2、3、4、4の列1が含まれています。
表Bには、エントリ1、3、4、4の列2があります。
表Cには、エントリ1、2、4、4の列3があります。

与えられたクエリは

SELECT * FROM  A EXCEPT (SELECT * FROM  B INTERSECT SELECT * FROM C ).

私はこの質問を試験紙で見ました。期待される答えは2であると述べられましたが、このクエリから得られた答えは1,2,4でした。その背後にある原理が理解できません。

4

2 に答える 2

2

ええと、私が見る限り、期待される答えとあなたが得た答えの両方が間違っています。使用している RDBMS である可能性がありますが、クエリを分析すると結果は2,3. INTERSECTまず、テーブルBとの間を実行する必要があります。C交差する値は14です。その結果を取得すると、テーブルから と を除くすべての値を取得する必要があります。これにより、 と が残ります(とAは異なる値のみを返すため) 。これを試すための sqlfiddleを次に示します。1423EXCEPTINTERSECT

于 2012-10-14T03:35:19.140 に答える
1

括弧があるため、 と の間の INTERSECT がB最初Cに実行され、結果は (1,4) になります。これが後半部分を取り、単独で実行していることを確認することもできます。

SELECT * FROM  B INTERSECT SELECT * FROM C

次のステップは、A(2,3) を残す (1,4) の前の結果に存在するものを除いて、すべてを選択することです。

答えは、1、2、4 ではなく、2、3 であるべきです。

ところで、クエリに括弧がまったくない場合でも、INTERSECT 演算子は EXCEPT/UNION 演算子よりも優先順位が高いため、結果は同じであることに注意してください。これはSQL Serverのドキュメントですが、これらの演算子を実装するすべての DBMS に適用される標準と一致しています。

于 2012-10-14T03:38:23.160 に答える