0

我有个问题。我有两个具有相同列的表。我想创建第三个表,其中包含这两个表中的 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

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

我究竟做错了什么?

4

2 回答 2

2

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

于 2012-03-27T21:07:11.610 回答
0

您做错的唯一一件事是期望两个查询返回相同数量的行。

首先,您将用“999999”替换空值,然后比较结果值。这使得所有空值等于所有其他空值(以及值'999999',尽管可能不会出现该值)。

在第二个查询中,您在不替换空值的情况下进行交集。NULL 从不等于任何其他值(包括其他 NULL),因此它将返回更少的行。

于 2012-03-27T20:44:27.527 回答