如何从一个表中选择另一个表中不存在的所有记录?

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);

从概念上讲,将是:在子查询中获取匹配的记录,然后在主查询中获取不在子查询中的记录。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值