【问题标题】:return single rows from one table that don't match other table从一个表返回与另一表不匹配的单行
【发布时间】:2014-05-18 00:48:54
【问题描述】:

所以我有两张桌子。我正在尝试加入两个表,并且只返回表 a 中在表 b 中没有匹配项的记录。到目前为止我很难过。

表 A

--------------------
name amount     date
--------------------
bob     250 4/8/2010
dan     100 4/8/2010
sla     222 4/8/2010
obo     344 4/8/2010
bob     100 4/8/2010

表 B

--------------------
name amount     date
--------------------
bob     250 4/8/2010
dan     100 4/8/2010
sla     500 4/8/2010
obo     300 4/8/2010
bob     100 4/8/2010

【问题讨论】:

  • 取决于你的 sql 版本,MINUS

标签: mysql sql join


【解决方案1】:

你可以使用EXISTS

SELECT * 
FROM a 
WHERE NOT EXISTS (SELECT * 
                  FROM b 
                  WHERE name = a.name 
                    AND amount = a.amount 
                    AND date = a.date)

【讨论】:

    【解决方案2】:

    在 SQL 中执行此操作的规范方法之一是使用 outer join

    select a.*
    from a left outer join b
    on (
      a."name" = b."name"
      and a."amount" = b."amount"
      and a."date" = b."date"
    ) where b."name" is null
    and b."amount" is null
    and b."date" is null
    

    左外连接返回连接左侧表中的所有行,无论它们是否匹配连接右侧表中的行。但是当左表中的行在右表中没有匹配时,右表的列设置为null。因此,您可以过滤掉所有 匹配的行,并仅返回左侧表中 匹配的行。

    【讨论】:

    • 这正是我想要的。这比我之前使用多项选择的方式快得多。
    • @morgan - 你的意思是像 Notulysses 的回答这样的相关子查询?是的,相关子查询通常比连接慢很多。
    • 是的。这基本上就是我正在做的,但更复杂。这是令人难以置信的缓慢。再次感谢您的帮助。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-08-15
    • 1970-01-01
    • 2020-09-16
    • 1970-01-01
    • 2012-09-19
    相关资源
    最近更新 更多