这是一个任意的例子,这是DB结构。我无法改变它。
我有两个表:[Phone]和[Models]。
在两个表格中,主要栏目是[电话]。[名称]和[模型]。[名称]。
通常,两个表都有相关数据;例如:
[Models.Name] [Models.Quarter]
Samsung Galaxy S3 1
Samsung Galaxy S4 2
Samsung Galaxy S5 3
[Phone.Name] [Phone.Quarter]
Samsung 1
由于表结构,我可以加入两个表的唯一方法是通过列Name和Quarter。所以我最终使用LEFT JOIN,我得到了我需要的结果:
SELECT Models.*, Phone.*
from dbo.Models left join Phone
on left(Models.Name, LEN(Phone.Name)) = Phone.Name
WHERE
[Phone.Quarter] = [Models.Quarter]
不幸的是,有些情况下[模型]有数据,但[电话];在这种情况下,[Models]有3条记录,但[Phone]没有。在这里,WHERE
条款违背了LEFT JOIN
的全部目的。
将两个LEFT JOIN
与相同的表一起使用是否有意义?
答案 0 :(得分:3)
使用外部联接时,如果要保留外部表中的连接空值,则必须在内部表上添加限制作为连接语法的一部分。
SELECT Models.*, Phone.*
FROM dbo.Models
LEFT JOIN Phone
on left(Models.Name, LEN(Phone.Name)) = Phone.Name
and [Phone.Quarter] = [Models.Quarter]
或者这个,虽然它不那么优雅,但是你无法区分NULL和连接以及NULL值。
SELECT Models.*, Phone.*
FROM dbo.Models
LEFT JOIN Phone
on left(Models.Name, LEN(Phone.Name)) = Phone.Name
WHERE ([Phone.Quarter] = [Models.Quarter] OR [Phone.Quarter] is null)