我有两张桌子:
表A
ID Name
1 abc
2 xyz
表B
ID Name
1 abc
2 xyz
3 mno
我需要两个表上面的不同值表单,我的意思是我只需要表B中的ID 3 Name mno(因为它是两个表中唯一的)
请让我知道如何获得这个价值。
谢谢, Ajay
答案 0 :(得分:0)
此查询将为您提供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
然后您可以执行不利操作并使用UNION 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
查询两次(see the answer to this question)因为它被使用了两次 - 所以这种方法可能会对性能产生影响。
答案 1 :(得分:0)
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一样被警告。它只会排除所有列上完全匹配的行。