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