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 & ", "
假设我有下表:
##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 & ", "