SQL Server INNER JOIN,其值为null并且相交

时间:2012-03-27 20:16:53

标签: 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, 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

返回第一个代码的不同行数。

我做错了什么?

2 个答案:

答案 0 :(得分:2)

这只能通过(City,Street,HouseNumber,PostCode)列的重复来解释。 Intersect将为所有重复数据准确返回one行,但内部联接将创建匹配行的n*m行。您能否确认这四列在Gymnasium和PrimarySchool中都是独一无二的?

答案 1 :(得分:0)

你唯一错误的做法是期望两个查询返回相同的行数。

在第一个中,您将使用'999999'替换空值,然后比较结果值。这使得所有空值都等于所有其他空值(以及值'999999',尽管可能不会出现该值)。

在第二个查询中,您正在交叉而不替换空值。 NULL永远不会等于任何其他值(包括其他NULL),因此它将返回更少的行。