获取与另一个表中的行不匹配的行

时间:2014-09-19 14:39:09

标签: sql

在SQL中,我该如何做反向连接?

例如,假设我有以下两个表

UsedSlide
    SlideId
    UserId
    SomeOtherValue

LegacySlide
   SlideId
   UserId

如何在UsedSlide中选择SlideIdUserIdLegacySlide任意一行中的值不匹配的所有行?

请注意,我特意指出了两个我们匹配的内容,否则我知道我可以使用NOT IN和子选择。

加分:在我的方案中,数据集很小,但如果它很大呢?我如何最有效地做到这一点?

3 个答案:

答案 0 :(得分:4)

您可以使用not exists运算符:

SELECT *
FROM   UsedSlide u
WHERE  NOT EXISTS (SELECT *
                   FROM   LegacySlide l
                   WHERE  u.SlideId = l.SlideId AND u.UserId = l.UserId)

答案 1 :(得分:2)

可以使用LEFT JOIN

  SELECT * from
  UsedSlide US
  LEFT JOIN LegacySlide LS
  ON US.SlideId = LS.SlideId
  and US.UserId = LS.UserId
  WHERE LS.SlideId is NULL
  AND LS.UserId is NULL

答案 2 :(得分:1)

使用 EXCEPT 运算符:

我测试过的一些示例代码:

CREATE TABLE #UsedSlide (SlideId INT NOT NULL, UserId INT NOT NULL, SomeOtherValue VARCHAR(10) NOT NULL)
CREATE TABLE #LegacySlide (SlideId INT NOT NULL, UserId INT NOT NULL)

INSERT INTO #UsedSlide(SlideId, UserId, SomeOtherValue)
VALUES
(1, 35, 'testing123'),
(2, 39, 'testingabc'),
(3, 24, 'testingxyz')

INSERT INTO #LegacySlide( SlideId, UserId )
VALUES  (1, 35),
        (2, 39)

SELECT SlideId, UserId
FROM #UsedSlide
EXCEPT
SELECT SlideId, UserId
FROM #LegacySlide

这会产生以下结果集:

SlideId UserId
------- ------
3       24

注意:EXCEPT中语句的顺序在这里很重要。如果您将最后一个语句作为:

运行
SELECT SlideId, UserId
FROM #LegacySlide
EXCEPT
SELECT SlideId, UserId
FROM #UsedSlide

......这不会产生预期的效果。这基本上是对集合的操作:找到不在元组集合中的“元组”。

EXCEPT 的配套运营商 INTERSECT - 在两个集合之间找到共同的元组。两者都非常有用。

顺便说一句,我认为Oracle有一个 MINUS 运算符,大致相当于EXCEPT(有人可以验证并找到链接吗?)