これは、e.login が NULL であるためである可能性があります。NULL 値を NOT IN として比較すると、常に false が返されます (ドキュメントを参照してください: NOT IN にも適用される演算子 NOT LIKE )。
COALESCE()を使用してこれを確認できます。
リスト内の最初の非 NULL 値を返します。非 NULL 値がない場合は NULL を返します。
だからあなたの場合:
SELECT e.*
FROM emails AS e
WHERE e.error <> 1
AND COALESCE(e.login,'') NOT IN (select email_login from accounts)
これが機能しない場合は、先行または末尾のスペースによる違いを避けるために、LIKE 演算子またはトリミングされた値のいずれかを正確に比較する必要があるかどうかに応じて試してください。
%LIKE% を使用:
SELECT e.*
FROM emails AS e
WHERE e.error <> 1
AND NOT EXISTS (SELECT email_login
FROM accounts
WHERE email_login LIKE CONCAT('%', e.login ,'%'))
% は、ゼロ文字を含む任意の数の文字に一致することに注意してください
正確なログインを一致させるには:
SELECT e.*
FROM emails AS e
WHERE e.error <> 1
AND NOT EXISTS (SELECT email_login
FROM accounts
WHERE UPPER(TRIM(email_login)) = UPPER(TRIM(e.login)))