我有问题。我有两个具有相同列的表。我想创建一个第三个表,它将从这两个表中获得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
返回第一个代码的不同行数。
我做错了什么?
答案 0 :(得分:2)
这只能通过(City,Street,HouseNumber,PostCode)列的重复来解释。 Intersect将为所有重复数据准确返回one
行,但内部联接将创建匹配行的n*m
行。您能否确认这四列在Gymnasium和PrimarySchool中都是独一无二的?
答案 1 :(得分:0)
你唯一错误的做法是期望两个查询返回相同的行数。
在第一个中,您将使用'999999'替换空值,然后比较结果值。这使得所有空值都等于所有其他空值(以及值'999999',尽管可能不会出现该值)。
在第二个查询中,您正在交叉而不替换空值。 NULL永远不会等于任何其他值(包括其他NULL),因此它将返回更少的行。