1

我有两张桌子:

表 A

ID   Name
1    abc   
2    xyz

表 B

ID    Name             
1     abc
2     xyz                 
3     mno

我需要两个表上方的不同值形式,我的意思是我只想要表 B 中的 ID 3 Name mno(因为它在两个表中是唯一的)

请让我知道如何获得此值。

谢谢,阿杰

4

2 回答 2

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

然后你可以做相反的事情并使用 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两次查询(参见这个问题的答案),因为它被使用了两次——所以这种方法可能会对性能产生一些影响。

于 2013-02-14T18:38:50.043 回答
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。它只会排除所有列都完全匹配的行。

于 2013-02-14T20:08:05.557 回答