为什么左联接不给所有左表值和条件变为假的其他表的空值?

时间:2019-08-30 14:19:16

标签: sql sql-server-2012

我有一个像这样的桌子-

enter image description here

预期输出为-:

enter image description here

通过此查询,我得到了准确的结果:

select a.city as source,nullif(b.city,a.city) as destination from TABLENAME a,TABLENAME b

但是我不想在查询中使用任何sql函数,所以我尝试了一个-:

select a.city as Source,b.city as Destination
from testq a left join testq b
on a.city<>b.city  

使用此查询,我得到-:

enter image description here

我知道我在某个地方犯了一个非常愚蠢的错误,但是我被困在这里,现在却没有得到。如果可以的话请帮帮我。 在此先感谢:)

3 个答案:

答案 0 :(得分:1)

就像我在评论中说的那样,除了使用ANSI-92语法外,我看不到查询的任何问题:

SELECT TN1.city AS source,
       NULLIF(TN2.city, TN1.city) AS destination
FROM TABLENAME TN1
     CROSS JOIN TABLENAME TN2;

如果出于未知原因,您不得使用NULLIF,您可以做类似这样的事情;但我认为您没有理由这么做:

SELECT TN1.city AS source,
       TN2.city AS Destination
FROM TABLENAME TN1
     CROSS APPLY (SELECT ca.city
                  FROM TABLENAME ca
                  WHERE ca.city != TN1.city
                  UNION ALL
                  SELECT NULL) TN2;

答案 1 :(得分:1)

为什么不使用union all

select c.city, c2.cty
from cities c join
     cities c2
     on c.city <> c2.city
union all
select c.city, null
from cities c;

答案 2 :(得分:0)

如果您不想使用任何功能,则CASE子句可能在这里为您工作-

 SELECT a.city as source, CASE WHEN a.city = b.city THEN null ELSE b.city as destination
 FROM TABLENAME a
 CROSS JOIN TABLENAME b