从一个表中返回不存在于另一个表中的值
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')
【问题讨论】:
不存在,或左连接,或不存在,或除... /跨度> @MatBailieEXCEPT
子句在 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 在您当前的查询中不会。因为它不相关,因此优化器无法进一步优化它(通过使用索引)
我当前的查询不需要任何优化。它会像不退出一样做。以上是关于从一个表中返回不存在于另一个表中的值的主要内容,如果未能解决你的问题,请参考以下文章
Google Script:如果行中的值存在于另一个工作表中,则删除行
如何编写一个 MySQL 查询,该查询返回一个临时列,其中包含与该行相关的项目是不是存在于另一个表中的标志