2

Teacher_lm と teacher の 2 つのテーブルがあります。これらのテーブルには、両方の列「teach_email」があります

私が必要としているのは、teacher_lm には存在するが教師には存在しないメールを取得することです。

これを解決するには2つの異なるアプローチがありますが、一方が結果を返さず、もう一方が多くの行を返す理由がわかりません。

1 つ目: 842 行

SELECT   DISTINCT lm.teacher_email
FROM       teacher_lm as lm
WHERE      NOT EXISTS (SELECT  * FROM teacher as lt
       WHERE lt.teacher_email = lm.teacher_email         
      )

2つ目:結果なし

SELECT DISTINCT lm.teacher_email FROM
teacher_lm AS lm
WHERE lm.teacher_email NOT IN
(SELECT lt.teacher_email FROM 
teacher AS lt)

ここで私が間違っていることを教えてください。これを行う最善の方法は何ですか?

ありがとうございました。

4

2 に答える 2

6

「in」サブクエリには、おそらく NULL が含まれています。

代わりにこれを試してください:

SELECT DISTINCT lm.teacher_email
FROM teacher_lm AS lm
WHERE lm.teacher_email NOT IN (SELECT coalesce(lt.teacher_email, '')
                               FROM  teacher AS lt) 

ちなみにmysqlは最適化の理由で最初のバージョンが推奨されるバージョンだと思います。

于 2012-08-15T17:52:17.927 に答える
1

最初のクエリは、行全体の存在に取り組んでいます。

2 番目のクエリが null を返す可能性があります。null が存在する場合、NOT IN 句がうまく機能するとは思えません。

ゴードンの答えは、ヌルを空の文字列に置き換えることでこれを修正します。

于 2012-08-15T17:58:45.787 に答える