【问题标题】: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 个欺骗部分。

标签: mysql sql


【解决方案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`)
      

      我相信代码很容易理解。

      【讨论】:

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