Sql server 需要表中的唯一值

Sql server 需要表中的唯一值,sql-server,Sql Server,我有两张桌子: ID Name 1 abc 2 xyz 表A ID Name 1 abc 2 xyz 表B ID Name 1 abc 2 xyz ID Name 1 abc 2 xyz 3 mno 我需要两个表上面的不同值形式,我的意思是我只需要表B中的ID 3名称mno,因为它在两个表中是唯一的 ID Name 1 ab

我有两张桌子:

ID   Name
1    abc   
2    xyz
表A

ID   Name
1    abc   
2    xyz
表B

ID   Name
1    abc   
2    xyz
ID    Name             
1     abc
2     xyz                 
3     mno
我需要两个表上面的不同值形式,我的意思是我只需要表B中的ID 3名称mno,因为它在两个表中是唯一的

ID   Name
1    abc   
2    xyz
请让我知道如何获得该值

ID   Name
1    abc   
2    xyz
谢谢,
Ajay

此查询将从B中获取A中不存在的行:

ID   Name
1    abc   
2    xyz
然后,您可以做相反的事情,并使用UNION ALL以两种方式实现:

ID   Name
1    abc   
2    xyz
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
实现这一目标的另一个途径是:

ID   Name
1    abc   
2    xyz
;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操作符可能适合您。下面是一个使用您的数据的示例

ID   Name
1    abc   
2    xyz
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

尽管它的行为像工会,但要得到警告。它只排除所有列上完全匹配的行。

根据您使用的SQL Server版本,您可能需要查看。通常,用特定版本的SQL Server标记问题是有帮助的。
ID   Name
1    abc   
2    xyz