今のところこれを理解することはできないようです。 2つのテーブルを結合して、テーブルBに一致する列がないテーブルAの行のみを選択しようとしています。たとえば、ユーザーテーブルと送信テーブルがあるとします。
users
テーブルには次の列があります:id, username
sent
テーブルには次の列があります:id, username
users
テーブルからusername
が存在しないsent
からすべての行を選択したい。したがって、tom
がusers
にあり、sent
にある場合、彼は選択されません。彼がusers
にいるがsent
にいない場合は選択されます。私はこれを試しましたが、まったく機能しませんでした:
SELECT pooltest.name,senttest.sentname
FROM pooltest,senttest
WHERE pooltest.name != senttest.sentname
このSQLを試してください:
SELECT users.username
FROM users
LEFT JOIN sent ON sent.username = users.username
WHERE sent.username IS NULL;
私の意見では、より良い方法は次のとおりです。
SELECT users.username
FROM users
LEFT JOIN sent ON sent.id = users.id
WHERE sent.id IS NULL;
両方のidフィールドにはインデックスが付けられるため(主キーと考えていました)、このクエリは、最初に提案したクエリよりも最適化されます。
しかし、私の最初の提案があなたにとってより良いと思うかもしれません、それはあなたのアプリケーションに対するあなたの要件によって異なります。
通常、このタイプのクエリにはNOT EXISTS
を使用します
SELECT p.Name
FROM pooltest p
WHERE NOT EXISTS (SELECT s.Name
FROM senttest s
WHERE s.Name = p.Name)
別の方法としては、LEFT OUTER JOIN
を使用してNULL
を確認することです
SELECT p.Name
FROM pooltest p
LEFT OUTER JOIN senttest s ON s.Name = p.Name
WHERE s.Name IS NULL
使用している暗黙的な結合構文は廃止されたと見なされ、明示的な結合に置き換える必要があることに注意してください。