在SQL中,我该如何做反向连接?
例如,假设我有以下两个表
UsedSlide
SlideId
UserId
SomeOtherValue
LegacySlide
SlideId
UserId
如何在UsedSlide
中选择SlideId
和UserId
与LegacySlide
任意一行中的值不匹配的所有行?
请注意,我特意指出了两个我们匹配的内容,否则我知道我可以使用NOT IN
和子选择。
加分:在我的方案中,数据集很小,但如果它很大呢?我如何最有效地做到这一点?
答案 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(有人可以验证并找到链接吗?)