使用EXCEPT - SQL Server选择行

时间:2016-11-23 11:38:39

标签: sql sql-server

在SQL Server中使用except时,如何才能返回不同的列?

示例:

SELECT ID, NAME FROM TABLE_B
EXCEPT
SELECT ID, NAME FROM TABLE_A

在这种情况下,如果有不同的名称,只返回show name列。

2 个答案:

答案 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