一些简单的数据集来说明问题:
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的结果,避免了那种导致执行缓慢的方法的浪费?
答案 0 :(得分:0)
UNION会有所不同。如果你想要重复,那么使用UNION ALL。
UNION非常高效,可能是最好的方法。努力优化个人选择。
我认为您可以将第二个更改为连接(不是左侧)并添加和(L.Name<> J.Name)