我有两张桌子:
表 A
ID Name
1 abc
2 xyz
表 B
ID Name
1 abc
2 xyz
3 mno
我需要两个表上方的不同值形式,我的意思是我只想要表 B 中的 ID 3 Name mno(因为它在两个表中是唯一的)
请让我知道如何获得此值。
谢谢,阿杰
我有两张桌子:
表 A
ID Name
1 abc
2 xyz
表 B
ID Name
1 abc
2 xyz
3 mno
我需要两个表上方的不同值形式,我的意思是我只想要表 B 中的 ID 3 Name mno(因为它在两个表中是唯一的)
请让我知道如何获得此值。
谢谢,阿杰
此查询将为您提供B
不存在的行A
:
SELECT b.* FROM TableB b
OUTER JOIN TableA a ON a.ID = b.ID AND a.Name = b.Name
WHERE a.ID IS NULL
然后你可以做相反的事情并使用 aUNION ALL
来获得它:
SELECT a.* FROM TableA a
OUTER JOIN TableB b ON b.ID = a.ID AND b.Name = a.Name
WHERE b.ID IS NULL
UNION ALL
SELECT b.* FROM TableB b
OUTER JOIN TableA a ON a.ID = b.ID AND a.Name = b.Name
WHERE a.ID IS NULL
实现它的另一种方法是:
;WITH MatchingRows AS (
SELECT a.ID FROM TableA a
JOIN TableB b ON b.ID = a.ID AND b.Name = a.Name
)
SELECT * FROM TableA
WHERE ID NOT IN (SELECT m.ID FROM MatchingRows m)
UNION ALL
SELECT * FROM TableB
WHERE ID NOT IN (SELECT m.ID FROM MatchingRows m)
我不确定这是否表现更好 - 这只是我想到的。如果我没记错的话,这实际上会运行WITH
两次查询(参见这个问题的答案),因为它被使用了两次——所以这种方法可能会对性能产生一些影响。
EXCEPT 运算符可能适合您。这是使用您的数据的示例。
CREATE TABLE TableA (id int, name varchar(50))
INSERT INTO TableA VALUES (1, 'abc'),(2,'xyz')
CREATE TABLE TableB (id int, name varchar(50))
INSERT INTO TableB VALUES (1, 'abc'),(2,'xyz'),(3,'mno')
SELECT * FROM TableB
EXCEPT
SELECT * FROM TableA
请注意,尽管它的行为类似于 UNION。它只会排除所有列都完全匹配的行。