SQL EXCEPT 在比较期间忽略某些列

SQL EXCEPT ignore some columns during compare

假设我有下表:

##TABLE1

FirstName, LastName,     AsOfDate, NoOfEpisodes
     Bart,  Simpson,   07/01/2018,          123
     Lisa,  Simpson,   03/01/2018,          110

##TABLE2

FirstName, LastName,     AsOfDate, NoOfEpisodes
     Bart,  Simpson,   08/01/2018,          123
     Lisa,  Simpson,   08/01/2018,          130

如果我运行下面的SQL命令找出两个表之间的差异:

select * from ##TABLE2 
except (select * from ##TABLE1)

结果会是

  FirstName, LastName,     AsOfDate, NoOfEpisodes
       Bart,  Simpson,   08/01/2018,          123
       Lisa,  Simpson,   08/01/2018,          130

我想 运行 此比较但忽略 AsOfDate 字段但将其保留在最终结果中。如果我这样做 SQL:

select FirstName, LastName, NoOfEpisodes
from ##TABLE2 
except (select FirstName, LastName, NoOfEpisodes from ##TABLE1)

结果会像这样

  FirstName, LastName,  NoOfEpisodes
       Lisa,  Simpson,           130

但我需要它看起来像这样

FirstName, LastName,     AsOfDate, NoOfEpisodes
     Lisa,  Simpson,   08/01/2018,          130

显然这是一组样本数据。生产中的数据可能包含 20-30 列,我最多只想排除一些。我希望可能有类似 'IGNORE' 或 'NOT IN' 的函数,我可以将其应用于 SQL 脚本以排除几列。

怎么样?

SELECT T1.FirstName, T1.LastName, T2.AsOfDate, T2.NoOfEpisodes
FROM ##TABLE1 T1
INNER JOIN ##TABLE2 T2 
     ON T1.FirstName = T2.FirstName AND T1.LastName = T2.LastName
WHERE T1.NoOfEpisodes != T2.NoOfEpisodes

好的,根据您的意见。如果我们使用 CTE 怎么办?

;WITH ex as (
   select FirstName, LastName, NoOfEpisodes
   from ##TABLE2 
   except (select FirstName, LastName, NoOfEpisodes from ##TABLE1)
)
SELECT ex.FistName, ex.LastName, ex.NoOfEpisodes, T2.AsOfDate
FROM ex
INNER JOIN ##TABLE2 T2
   ON ex.FirstName = T2.FirstName AND ex.LastName = T2.LastName

如果列太多无法处理,您可以使用 excel 为您编写 SQL where 子句。打开 SSMS 和 "Select top 1000 Rows",这将为您提供 table 的列列表。复制该列表并将其粘贴到 excel 的 A 列中。然后在B列,添加这个函数:

="OR T1." & A1 & " != T2." & A1

将该函数复制到 B 中的所有行,然后您可以复制值,这些值将是要放入 where 子句的一长串条件。您可以将此与 SELECT 列表相同:

="T2." & A144 & ", "