Sql server SQL Server内部联接(具有null值和intersect)
我有个问题。我有两个列相同的表。我想创建第三个表,它将具有来自这两个表的id行,其中四个选择的列是相同的 我解决了将数据null与isnull进行比较的问题 我写了这样的东西:Sql server SQL Server内部联接(具有null值和intersect),sql-server,join,isnull,intersect,Sql Server,Join,Isnull,Intersect,我有个问题。我有两个列相同的表。我想创建第三个表,它将具有来自这两个表的id行,其中四个选择的列是相同的 我解决了将数据null与isnull进行比较的问题 我写了这样的东西: WITH cteCandidates (City, Street, HouseNumber, PostCode) AS ( SELECT City, Street, HouseNumber, PostCode FROM Gymnasium INTERSECT SELECT City
WITH cteCandidates (City, Street, HouseNumber, PostCode)
AS
(
SELECT City, Street, HouseNumber, PostCode
FROM Gymnasium
INTERSECT
SELECT City, Street, HouseNumber, PostCode
FROM PrimarySchool
)
select e.Id as 'Gymnasium',
p.Id as 'PrimarySchool'
FROM
Gymnasium AS e
Inner join cteCandidates AS c
on isnull(e.City ,'999999') = isnull(c.City ,'999999')
AND isnull(e.Street ,'999999') = isnull(c.Street ,'999999')
AND isnull(e.HouseNumber,'999999') = isnull(c.HouseNumber,'999999')
AND isnull(e.PostCode ,'999999') = isnull(c.PostCode ,'999999')
inner join PrimarySchool as p
on isnull(e.City ,'999999') = isnull(p.City ,'999999')
AND isnull(e.Street ,'999999') = isnull(p.Street ,'999999')
AND isnull(e.HouseNumber,'999999') = isnull(p.HouseNumber,'999999')
AND isnull(e.PostCode ,'999999') = isnull(p.PostCode ,'999999')
order by PrimarySchool
除以下代码外,所有操作都正常:
SELECT City, Street, HouseNumber, PostCode
FROM Gymnasium
INTERSECT
SELECT City, Street, HouseNumber, PostCode
FROM PrimarySchool
返回的行数与第一个代码的行数不同
我做错了什么 您唯一做错的事情是期望两个查询返回相同数量的行 在第一种情况下,将NULL替换为“999999”,然后比较结果值。这使得所有空值等于所有其他空值(以及值'999999',尽管该值可能不会出现)
在第二个查询中,您在交叉点中执行此操作,而不替换空值。NULL永远不等于任何其他值(包括其他NULL),因此它将返回更少的行。这只能通过(城市、街道、房屋号、邮政编码)列的重复来解释。Intersect将为所有重复数据返回一行,但Intersect将创建匹配行。你能验证一下这四个专栏在体育馆和小学都是独一无二的吗?也许我读得不对,但我认为这不是真的。引用自MSDN:。快速测试显示将返回一行:
select'a',null intersect select'a',null
您是对的。这些表中有重复的行。谢谢回答!