在SQL Server中使用except
时,如何才能返回不同的列?
示例:
SELECT ID, NAME FROM TABLE_B
EXCEPT
SELECT ID, NAME FROM TABLE_A
在这种情况下,如果有不同的名称,只返回show name列。
答案 0 :(得分:1)
您的代码是正确的。你不会得到任何重复的行(ID
+ NAME
!)。
但如果我理解正确,你只想专注于名字。然后从选定字段中删除ID:
SELECT NAME FROM TABLE_B
EXCEPT
SELECT NAME FROM TABLE_A
[编辑,关于评论:]
这显示了TABLE_B中不在TABLE_A中的不同行。这是使用EXCEPT
的目标。对于其他任何事情,EXCEPT
不是解决方案。
如果您要从两个表中查找所有不同的名称,您可以使用:
select distinct NAME
from
(select NAME from TABLE_A
UNION
select NAME from TABLE_B) as T
答案 1 :(得分:0)
您可以获取一个结果集,该结果集以
形式标记第二个表中的非现有数据ID flag_ID NAME flag_Name
1 ! A ! -- No Id=1, no NAME ='A' exists in the second table
3 NULL NULL ! -- Id=3 exists, no NAME is NULL exists
4 NULL Y NULL -- Both values exist but never in the same row
并继续您需要的标准。
假设ID为非空,NAME可以为空,应将NULL视为“相等”:
SELECT b.ID,
CASE WHEN NOT EXISTS (SELECT 1 FROM a t2 WHERE t2.ID=b.ID) THEN '!' END flag_ID,
b.NAME,
CASE WHEN NOT EXISTS (SELECT 1 FROM a t2
WHERE ISNULL(NULLIF(b.NAME, t2.NAME), NULLIF(t2.NAME, b.NAME)) IS NULL)
THEN '!' END flag_Name
FROM b
LEFT JOIN a ON a.ID = b.ID
AND ISNULL(NULLIF(a.NAME, b.NAME), NULLIF(b.NAME, a.NAME)) IS NULL
WHERE a.ID IS NULL
OR ISNULL(NULLIF(a.NAME, b.NAME), NULLIF(b.NAME, a.NAME)) IS NOT NULL