0

MySQL で比較的単純なクエリを作成し、JOIN名前と姓が一致した場所に基づいて 3 つのテーブルを作成しました。そこから、一致しなかったレコードのみを表示する別のクエリを書きたかったのですが、そのJOIN方法がわかりませんでした。元のクエリのようなものを含むサブクエリを使用することに関係しているNOT INと思いますが、必要な結果を得ることができませんでした。

これは、部分的に適切に機能することを考え出そうとした回避策です。

SELECT *, 
  if(t2.first=t1.first AND t2.last=t1.last, "Match", "No Match") AS "t2 Match",
  if(t3.first=t1.first AND t3.last=t1.last, "Match", "No Match") AS "t3 Match"
FROM t1
LEFT JOIN t2 ON t2.first=t1.first AND t2.last=t1.last
LEFT JOIN t3 ON t3.first=t1.first AND t3.last=t1.last
WHERE if(t2.first=t1.first AND t2.last=t1.last, "Match", "No Match")="No Match"
   OR if(t3.first=t1.first AND t3.last=t1.last, "Match", "No Match")="No Match";

これはかなり単純で簡単なことだと思いますが、正しい結果が得られません。誰でも助けることができますか?

ありがとう!

4

1 に答える 1

5

一致しないということは、結果のt2(またはt3) 列に Null が入力されることを意味します。したがって、IS NULLチェックを使用できます。

SELECT t1.*
FROM t1
  LEFT JOIN t2 ON t2.first = t1.first AND t2.last = t1.last
  LEFT JOIN t3 ON t3.first = t1.first AND t3.last = t1.last
WHERE t2.first IS NULL
   OR t3.first IS NULL ;

そして、あなたは正しかったので、次を使用してクエリを作成することもできますNOT IN(警告: 結合する列が null 許容でない場合のみ。そうしないと、予期しない結果が生じる可能性があります)。

SELECT t1.*
FROM t1
WHERE (first, last) NOT IN
      ( SELECT first, last  FROM t2 )
   OR (first, last) NOT IN
      ( SELECT first, last  FROM t3 )
  ;

または使用NOT EXISTS

SELECT t1.*
FROM t1
WHERE NOT EXISTS 
      ( SELECT 1
        FROM t2
        WHERE t1.first = t2.first
          AND t1.last = t2.last
      )
   OR NOT EXISTS 
      ( SELECT 1
        FROM t3
        WHERE t1.first = t3.first
          AND t1.last = t3.last
      ) ;
于 2013-06-27T18:09:16.567 に答える