Sql server SQL Server内部联接(具有null值和intersect)

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

我有个问题。我有两个列相同的表。我想创建第三个表,它将具有来自这两个表的id行,其中四个选择的列是相同的

我解决了将数据null与isnull进行比较的问题

我写了这样的东西:

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
您是对的。这些表中有重复的行。谢谢回答!