【发布时间】:2014-06-19 15:45:41
【问题描述】:
看来我需要一个MAGIC JOIN,它应该在非空值上作为INNER JOIN 工作,但同时在空值上作为LEFT JOIN 工作。 “空”是指非空零长度 char 值,如下所示:''。
我有桌子Customers:
CustomerCode Customer_AddressCode
CC01 AC01
CC02 somebullcrap
CC03
CC04 AC02
CC05
和Addresses:
AddressCode AddressValue
AC01 City 01
AC02 City 02
AC03 City 03
AC04 City 04
AC05 City 05
想要的输出是这样的:
CustomerCode AddressValue
CC01 City 01
CC03 NULL
CC04 City 04
CC05 NULL
所以它会省略在Addresses 表中不存在的带有代码somebullcrap 的地址。
我能想到的最好的是:
SELECT c.CustomerCode, a.AddressValue
FROM Customers c
LEFT JOIN Addresses a ON a.AddressCode = c.Customer_AddressCode
WHERE c.Customer_AddressCode = ''
OR c.Customer_AddressCode IN
(
SELECT AddressCode
FROM Address
)
有没有更优雅的解决方案?
是的,我确实知道可为空的外键。我只是在询问解决方案,无需更改表/制作临时表/修改现有表数据。
【问题讨论】:
标签: sql-server tsql left-join inner-join