在这种情况下使用LEFT JOIN?

时间:2014-07-16 17:31:02

标签: sql sql-server tsql

这是一个任意的例子,这是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与相同的表一起使用是否有意义?

1 个答案:

答案 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)