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 左外连接难题的主要内容,如果未能解决你的问题,请参考以下文章