36

今のところ、これを理解できないようです。2つのテーブルを結合しようとして、テーブルBに一致する列がないテーブルAの行のみを選択しようとしています。たとえば、ユーザーテーブルと送信済みテーブルがあるとします。

users表には次の列があります。id, username
sent表には次の列があります。id, username

テーブルに存在usersusernameない行をすべて選択したい。sentしたがって、が含まれている場合tomuserssentは選択されません。彼が入っているが入ってusersいない場合、彼はsent選ばれます。私はこれを試しましたが、まったく機能しませんでした:

SELECT pooltest.name,senttest.sentname 
FROM pooltest,senttest 
WHERE pooltest.name != senttest.sentname
4

3 に答える 3

62

通常、NOT EXISTSこのタイプのクエリに使用します

SELECT p.Name
FROM   pooltest p
WHERE  NOT EXISTS (SELECT s.Name
                   FROM   senttest s
                   WHERE  s.Name = p.Name)

別の方法は、 a を使用し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

使用している暗黙的な結合構文は廃止されたと見なされ、明示的な結合に置き換える必要があることに注意してください。

于 2012-06-10T12:47:25.810 に答える
26

この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 フィールドがインデックス化されるため (私が考えた主キー)、このクエリは最初に提案したクエリよりも最適化されます。

ただし、私の最初の提案の方が適切であると思われるかもしれませんが、それはアプリケーションの要件によって異なります。

于 2012-06-10T12:52:59.617 に答える
-3

これがあなたを助けることができるかもしれません....

私も同じ問題を抱えていましたが、このクエリを使用して解決しました

INSERT INTO tbl1 (id,name) SELECT id,name from tbl2 where (name) not in(select name from tbl1);

これがあなたの問題を解決することを願っています

于 2015-08-11T10:34:47.747 に答える