t-sql 左外连接难题

Posted

技术标签:

【中文标题】t-sql 左外连接难题【英文标题】:t-sql LEFT OUTER JOIN Conundrum 【发布时间】:2015-11-17 17:53:06 【问题描述】:

一些简单的数据集来说明问题:

SELECT * FROM LeftTable

OID Name    LeftBlah
1   Name1   LeftBlah1
2   Name2   LeftBlah2

SELECT * FROM JoinTable

OID Name    RightBlah
1   Name1   RightBlah1
2   Name1-Dumb1 RightBlah1-Dumb1
3   Name1-Dumb2 RightBlah1-Dumb2
4   Name2-Dumb1 RightBlah2-Dumb1
5   Name2-Dumb2 RightBlah2-Dumb2

我查询这些表的一种方式,后面是查询输出:

SELECT L.Name, L.LeftBlah, J.Name AS JName, J.RightBlah, LEFT(J.Name, 5) AS WFT
FROM LeftTable AS L
LEFT OUTER JOIN JoinTable AS J ON (L.Name = J.Name)

Name    LeftBlah    JName   RightBlah   WFT
Name1   LeftBlah1   Name1   RightBlah1  Name1
Name2   LeftBlah2   NULL    NULL    NULL

我查询这些表的另一种方式,然后是查询输出:

SELECT L.Name, L.LeftBlah, J.Name AS JName, J.RightBlah, LEFT(J.Name, 5) AS WFT
FROM LeftTable AS L
LEFT OUTER JOIN JoinTable AS J ON (L.Name = LEFT(J.Name, 5))

Name    LeftBlah    JName   RightBlah   WFT
Name1   LeftBlah1   Name1   RightBlah1  Name1
Name1   LeftBlah1   Name1-Dumb1 RightBlah1-Dumb1    Name1
Name1   LeftBlah1   Name1-Dumb2 RightBlah1-Dumb2    Name1
Name2   LeftBlah2   Name2-Dumb1 RightBlah2-Dumb1    Name2
Name2   LeftBlah2   Name2-Dumb2 RightBlah2-Dumb2    Name2

桌子设计很笨,但我不能改变它。第二个表的名称字段中带有“-”的条目是一些小丑的“神奇的字符串”方式,表明它们是“主要事物”的子细节(两个表中的名称相同)。如果第二个表中缺少“主要内容”,这可能表示要么数据问题正常情况(呵呵,呵呵)...丢失可能是正常的如果没有子细节,但也有可能在没有子细节的情况下有一个主要的东西。如您所料,第一个查询显示“主要内容” - 只是第二个表中的空数据。第二个查询省略了 null-null-null 行。

起初,我认为这是 LEFT OUTER JOIN 的问题,但是,它已经完成了恢复第一个表中的每一行的工作。如果它为 Name2 带回了一个 null-null-null 行,它可能会为 Name1 带回一个,我当然不希望这样。

有趣的是,我实际上可以通过两个查询的 UNION 得到我想要的。我不明白为什么我不取回一堆重复的行,但我是一个不情愿的编码人员,对获得我想要的结果更感兴趣,而不是理解所有编码的复杂性。不幸的是,我想要的结果需要比针对我正在使用的真实数据的两个查询表单的简单 UNION 运行得更快。

所以,最后,我的问题是:有没有办法以某种巧妙的方式获得 UNION 的结果,从而避免导致执行缓慢的方法的浪费?

【问题讨论】:

桌子设计很笨……确实如此。我喜欢你的示例数据。 【参考方案1】:

UNION 默认情况下是不同的。如果要重复,请使用 UNION ALL。

UNION 非常有效,可能是这里最好的方法。努力优化个人选择。

我认为您可以将第二个更改为联接(不是左侧)并添加 and (L.Name J.Name)

【讨论】:

以上是关于t-sql 左外连接难题的主要内容,如果未能解决你的问题,请参考以下文章

左外连接和右外连接的区别

深入理解关系中的外连接,左外连接,右外连接

数据库的内连接外连接(左外连接右外连接全外连接)以及交叉连接(转)

左连接和左外连接有啥区别? [复制]

Linq左外连接 多字段连接

使用内连接,左外连接,交叉应用获取语法错误与 Where 子句