Answers:
SELECT t1.name
FROM table1 t1
LEFT JOIN table2 t2 ON t2.name = t1.name
WHERE t2.name IS NULL
问:这是怎么回事?
答:从概念上讲,我们从中选择所有行,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 name
FROM table2
WHERE name NOT IN
(SELECT name
FROM table1)
FAR在实践中更有效吗?我不知道为什么,但是我将其运行在800,000条以上的记录上,并且上述第二个答案的优势非常明显。我的$ 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/
这是最适合我的东西。
SELECT *
FROM @T1
EXCEPT
SELECT a.*
FROM @T1 a
JOIN @T2 b ON a.ID = b.ID
这是我尝试过的任何其他方法的两倍以上。
您可以EXCEPT
在mssql或MINUS
oracle中使用,它们根据以下内容是相同的:
这对我来说很敏锐
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
而且我已经看到FROM中的语法需要在mySQL中的表名之间加逗号,但是在sqlLite中,它似乎更喜欢空格。
最重要的是,当您使用错误的变量名时,它会留下问题。我的变量应该更有意义。有人应该解释为什么我们需要逗号或不使用逗号。