1

次のコードは、表 2 の SubjectB 列が表 1 の Subject A 列と一致する場合にデータをフェッチします。

SELECT
UID
FROM
Table1
WHERE EXISTS (
    SELECT 1
    FROM Table2
    WHERE SubjectB = SubjectA
)

閉じ括弧の後に追加の条件を追加したい:

AND another_column_from_table1 > 10

しかし、構文は有効ではないようです。WHERE EXISTS ... AND 条件でクエリを実行する正しい方法は何ですか?

4

2 に答える 2

4

最初のクエリを考えると、次のように記述できるはずです。

SELECT UID
  FROM Table1
 WHERE EXISTS (SELECT 1
                 FROM Table2
                WHERE SubjectB = SubjectA
              )
   AND another_column_from_table1 > 10;

クエリの最後に条件を追加するだけで構文エラーが発生することはありません。コメントから、これは構文的に受け入れられているようですが、出力は生成されません。これをデバッグするための明白なテクニックは次のとおりです。

SELECT UID, another_column_from_table1
  FROM Table1
 WHERE EXISTS (SELECT 1
                 FROM Table2
                WHERE SubjectB = SubjectA
              )

これにより、列に値が表示されます。おそらく、追加のフィルター条件を追加すると結果セットが空になるため、この選択の 2 番目の列の値はすべて 10 未満 (または null) になります。

Table1 と Table2 のエントリ間に 1 対 1 の関係がある場合は、代わりに JOIN を使用できます。

SELECT t1.UID
  FROM Table1 AS t1
  JOIN Table2 AS t2 ON t2.SubjectB = t1.SubjectA
 WHERE t1.another_column_from_table1 > 10;

Table1 の各行に対して Table2 に複数の行が存在する可能性がある場合は、DISTINCT を追加する必要があります。

SELECT DISTINCT t1.UID
  FROM Table1 AS t1
  JOIN Table2 AS t2 ON t2.SubjectB = t1.SubjectA
 WHERE t1.another_column_from_table1 > 10;
于 2012-04-08T22:29:21.540 に答える
1

これを実行してみませんか?

SELECT UID FROM Table1, Table2
WHERE SubjectB = SubjectA AND another_column_from_table1 > 10

おそらく、結合はアンチパターンではないでしょう:)

于 2012-04-08T22:20:28.793 に答える