回答:
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
列を除いて、結果からすべてのフィールドを無視します(存在することを確認したフィールド、from 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)
2番目の回答に投票するのに十分な担当者ポイントがありません。しかし、私は上の答えのコメントに同意しなければなりません。2番目の答え:
SELECT name
FROM table2
WHERE name NOT IN
(SELECT name
FROM table1)
実際にはFARの方が効率的です。理由はわかりませんが、80万件以上のレコードに対して実行しているため、上記の2番目の回答に示されている利点との違いは非常に大きくなっています。たったの0.02ドル
これは、minus
操作で実現できる純粋な集合論です。
select id, name from table1
minus
select id, name from table2
SELECT <column_list>
FROM TABLEA a
LEFTJOIN TABLEB b
ON a.Key = b.Key
WHERE b.Key IS NULL;
https://www.cloudways.com/blog/how-to-join-two-tables-mysql/
落とし穴に注意してください。のフィールドName
にTable1
Nullが含まれている場合は、驚きがあります。より良いです:
SELECT name
FROM table2
WHERE name NOT IN
(SELECT ISNULL(name ,'')
FROM table1)
これが私にとって最も効果的な方法です。
SELECT *
FROM @T1
EXCEPT
SELECT a.*
FROM @T1 a
JOIN @T2 b ON a.ID = b.ID
これは、私が試した他の方法の2倍以上の速さでした。
あなたが使用することができますEXCEPT
MSSQLまたはMINUS
oracleで、次のように同じです。
(まだコメントするのに十分なほどクールではないので)正しい答えで再投稿します...他の誰かがより良い説明が必要だと思った場合に備えて。
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ではスペースを優先するように見えました。
肝心なのは、不正な変数名を使用すると疑問が残ることです。私の変数はもっと理にかなっているはずです。そして、誰かがコンマが必要な理由、またはコンマが不要な理由を説明する必要があります。
特定のユーザーで選択する場合
SELECT tent_nmr FROM Statio_Tentative_Mstr
WHERE tent_npk = '90009'
AND
tent_nmr NOT IN (SELECT permintaan_tent FROM Statio_Permintaan_Mstr)
tent_npk
ユーザーのプライマリキーです