table1(ID,名称)
table2(ID,名称)
查询:
SELECT name
FROM table2
-- that are not in table1 already
#1楼
我的代表点不足,无法投票赞成第二个答案。 但是我必须不同意最佳答案的评论。 第二个答案:
SELECT name
FROM table2
WHERE name NOT IN
(SELECT name
FROM table1)
FAR在实践中更有效吗? 我不知道为什么,但是我将其运行在800,000条以上的记录上,并且上述第二个答案的优势非常明显。 我的$ 0.02
#2楼
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的每个数据库引擎中都可以工作
#3楼
你可以做
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种技巧来完成此任务
#4楼
这是纯集理论,您可以通过minus
运算来实现。
select id, name from table1
minus
select id, name from table2
#5楼
当心陷阱。 如果Table1
中的Name
字段包含空值,那么您很惊讶。 更好的是:
SELECT name
FROM table2
WHERE name NOT IN
(SELECT ISNULL(name ,'')
FROM table1)
#6楼
您可以在mssql中使用EXCEPT
或在oracle中使用MINUS
,它们根据以下内容是相同的:
http://blog.sqlauthority.com/2008/08/07/sql-server-except-clause-in-sql-server-is-like-to-minus-clause-in-oracle/
#7楼
这对我来说很敏锐
SELECT *
FROM [dbo].[table1] t1
LEFT JOIN [dbo].[table2] t2 ON t1.[t1_ID] = t2.[t2_ID]
WHERE t2.[t2_ID] IS NULL
#8楼
这是最适合我的东西。
SELECT *
FROM @T1
EXCEPT
SELECT a.*
FROM @T1 a
JOIN @T2 b ON a.ID = b.ID
这是我尝试过的任何其他方法的两倍以上。
#9楼
我将以正确的答案重新发布(因为我还没有足够的能力发表评论)。...以防其他人认为需要更好的解释。
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中,它似乎更喜欢空格。
最重要的是,当您使用错误的变量名时,它会留下问题。 我的变量应该更有意义。 有人应该解释为什么我们需要逗号或不使用逗号。
#10楼
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/
#11楼
查看查询:
SELECT * FROM Table1 WHERE
id NOT IN (SELECT
e.id
FROM
Table1 e
INNER JOIN
Table2 s ON e.id = s.id);
从概念上讲,将是:在子查询中获取匹配的记录,然后在主查询中获取不在子查询中的记录。