テーブル1 (id,name)の場合 テーブル2 (id, name)
クエリを実行します。
SELECT name
FROM table2
-- that are not in table1 already
SELECT t1.name
FROM table1 t1
LEFT JOIN table2 t2 ON t2.name = t1.name
WHERE t2.name IS NULL
Q:ここで何が起こっているのでしょうか?
A:概念的には、table1
からすべての行を選択し、それぞれの行について、table2
の name
カラムに同じ値を持つ行を探そうとします。もしそのような行がなければ、結果の table2
部分を空白にします。そして、一致する行が存在しない結果のみを選択することで、選択範囲を限定します。最後に、結果の中から name
カラム (table1
に存在することが確認されているもの) 以外のフィールドは無視します。
この方法は、すべての場合において最もパフォーマンスの高い方法ではないかもしれませんが、基本的には ANSI 92 SQL を実装しようとするすべてのデータベース・エンジンで動作するはずです。
のどちらかを行うことができます。
SELECT name
FROM table2
WHERE name NOT IN
(SELECT name
FROM table1)
または
SELECT name
FROM table2
WHERE NOT EXISTS
(SELECT *
FROM table1
WHERE table1.name = table2.name)
これを実現するための3つのテクニックについては、この質問を参照してください。
SELECT <column_list>
FROM TABLEA a
LEFTJOIN TABLEB b
ON a.Key = b.Key
WHERE b.Key IS NULL;
[![ここに画像の説明を入力してください][1]][1]
[https://www.cloudways.com/blog/how-to-join-two-tables-mysql/][2]
[1]: https://i.stack.imgur.com/mjS7g.png [2]: https://www.cloudways.com/blog/how-to-join-two-tables-mysql/
それは私のためにシャープに動作します。
SELECT *
FROM [dbo].[table1] t1
LEFT JOIN [dbo].[table2] t2 ON t1.[t1_ID] = t2.[t2_ID]
WHERE t2.[t2_ID] IS NULL
私は(まだコメントするほど冷静ではないので)正解を再投稿します...他の人がより良い説明が必要だと思った場合に備えて。
SELECT temp_table_1.name
FROM original_table_1 temp_table_1
LEFT JOIN original_table_2 temp_table_2 ON temp_table_2.name = temp_table_1.name
WHERE temp_table_2.name IS NULL
また、mySQLではテーブル名の間にカンマを必要とするFROMの構文を見たことがありますが、sqlLiteではスペースを好むようです。
要するに、間違った変数名を使うと疑問が残るということです。 私の変数はもっと意味があるはずです。 そして、なぜカンマが必要なのか、カンマが必要ないのかを説明してください。