从一个表中返回不存在于另一个表中的值

Posted

技术标签:

【中文标题】从一个表中返回不存在于另一个表中的值【英文标题】:Return Values From One Table That Don't Exist In Another 【发布时间】:2018-11-18 10:32:35 【问题描述】:

我有两张桌子,一张:

INSERT INTO `fictional_companies` (`ID`, `name`)
VALUES
    (8209948, 'Moulon Rouge LTD'),
    (11399177, 'Burgers Burgers Burgers LTD');

还有两个:

INSERT INTO `processed` (`ID`)
VALUES
    ('8209948');

我想从fictional_companies 表中返回结果,但前提是它们不存在于processed 表中。

在示例情况下,结果如下:

(11399177, 'Burgers Burgers Burgers LTD')

【问题讨论】:

不存在,或左连接,或不存在,或除... /跨度> @MatBailie EXCEPT 子句在 mysql 中不起作用 :-) 同意第 n 个欺骗部分。 【参考方案1】:

LEFT JOIN 基于与IS NULL 的正确关系检查右侧表,将得到那些与右侧表不匹配的行

SELECT fc.*
FROM fictional_companies AS fc
LEFT JOIN processed AS p ON p.ID = fc.ID
WHERE p.ID IS NULL

另一种方法是使用Correlated Subqueries with Not Exists

SELECT fc.*
FROM fictional_companies AS fc
WHERE NOT EXISTS (SELECT 1 FROM processed AS p 
                  WHERE p.ID = fc.ID)

【讨论】:

【参考方案2】:

使用左连接并检查右表中的空值在哪里选择这些值

select t1.* from fictional_companies  t1 
left join processed t2 
on t1.ID=t2.ID
where t2.id is null

【讨论】:

【参考方案3】:

使用NOT IN:

SELECT * FROM `fictional_companies` WHERE `ID` NOT IN (SELECT `ID` FROM `processed`)

我相信代码很容易理解。

【讨论】:

是的,我看过很多关于它的文章,在这里我看到了很多文章,比如***.com/questions/173041/not-in-vs-not-exists,但我从未体验过任何有效性差异,我通常更喜欢更简洁的代码。 即使是 MySQL 优化器也会在内部自动将 IN 转换为 EXISTS 子句以进一步优化:dev.mysql.com/doc/refman/8.0/en/… 这正是我的观点。如果优化器将 NOT IN 转换为与任何其他解决方案一样执行的方式,那就顺其自然吧。我会写出更易读、更干净的代码并让它优化。 @forpas 在您当前的查询中不会。因为它不相关,因此优化器无法进一步优化它(通过使用索引) 我当前的查询不需要任何优化。它会像不退出一样做。

以上是关于从一个表中返回不存在于另一个表中的值的主要内容,如果未能解决你的问题,请参考以下文章

表单输入验证,仅允许存在于另一个表中的值 - Access

Google Script:如果行中的值存在于另一个工作表中,则删除行

如何编写一个 MySQL 查询,该查询返回一个临时列,其中包含与该行相关的项目是不是存在于另一个表中的标志

在一个表中查找不存在于另一个表中的ID

SQL Server 查询。用户存在于另一个表中但不存在用户的位置

只要它们不存在于另一个表T-SQL中,就从一个表中检索记录[重复]