19

列 A と B の値がテーブル T2 の列 C と D に一致するタプルを持たないテーブル T1 からすべてのレコードを選択したいと考えています。

2つの列を使用する mysql の「Where not in」では、フォーム select A,B from T1 where (A,B) not in (SELECT C,D from T2) を使用してそれを達成する方法を読むことができますが、T-SQL では失敗します。私にとっては、「「、」の近くの構文が正しくありません。」.

では、これを行うにはどうすればよいですか?

4

4 に答える 4

35

相関サブクエリを使用します。

  ... 
WHERE 
  NOT EXISTS (
    SELECT * FROM SecondaryTable WHERE c = FirstTable.a AND d = FirstTable.b
  )

(c, d)そのテーブルに多くの行が含まれていない限り、SecondaryTable over に複合インデックスがあることを確認してください。

于 2012-07-30T07:09:07.290 に答える
8

WHERE INtype ステートメントを使用してこれを行うことはできません。

代わりLEFT JOINに、ターゲット テーブル (T2) に移動して、T2.ID の場所を選択できますNULL

例えば

SELECT 
    T1.*
FROM
    T1 LEFT OUTER JOIN T2
    ON T1.A = T2.C AND T1.B = T2.D
WHERE
    T2.PrimaryKey IS NULL

T2 に対応する行がない T1 からの行のみを返します。

于 2012-07-30T07:09:16.017 に答える
1

Mysqlには「EXCLUDE」ステートメントがないため、Mysqlで使用しました。

このコード:

  1. テーブル T2 のフィールド C と D を 1 つの新しいフィールドに連結して、列を比較しやすくします。
  2. テーブル T1 のフィールド A と B を 1 つの新しいフィールドに連結して、列を比較しやすくします。
  3. T1 の新しいフィールドの値が T2 の新しいフィールドの値と等しくないすべてのレコードを選択します。

SQL ステートメント:

SELECT T1.* FROM T1 
  WHERE CONCAT(T1.A,'Seperator', T1.B) NOT IN
    (SELECT CONCAT(T2.C,'Seperator', T2.D) FROM T2)
于 2016-08-08T04:46:59.050 に答える