需要表中的唯一值

时间:2013-02-14 18:35:06

标签: sql-server

我有两张桌子:

表A

ID   Name
1    abc   
2    xyz

表B

ID    Name             
1     abc
2     xyz                 
3     mno

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

请让我知道如何获得这个价值。

谢谢, Ajay

2 个答案:

答案 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一样被警告。它只会排除所有列上完全匹配的行。