【发布时间】:2016-02-25 01:48:33
【问题描述】:
我有一个 MyNumbers 表,其中包含每个数字的数据,如下所示:
Number ServiceName ParameterName Value
10431 TypeA KeyCode1 14318
10431 TypeA KeyCode2 3213X
10431 TypeB KeyCode3 BlahBlah
换一个号码:
Number ServiceName ParameterName Value
28659 TypeA KeyCode2 6712X
28659 TypeB KeyCode3 NewBlah
我需要为表中的所有数字选择并显示它们的值,即使该值为空或该行不存在(例如上面的数字 28659,其中没有 ParameterName=KeyCode2 的行。请注意,对于另一个与上述数字不同,ServiceName=TypeB 可能会丢失,等等...
我使用的选择是:
select mn1.Number, mn1.Value, mn2.Value, mn3.Value
from MyNumbers mn1, MyNumbers mn2, MyNumbers mn3
where mn2.Number = mn1.Number
and mn3.Number = mn1.Number
and mn1.ServiceName = 'TypeA'
and mn1.ParameterName = 'KeyCode1'
and mn2.ServiceName = 'TypeA'
and mn2.ParameterName = 'KeyCode2'
and mn3.ServiceName = 'TypeB'
and mn3.ParameterName = 'KeyCode3';
因此,对于 Number=28659,这根本不返回任何行,因为没有具有 TypeA 和 KeyCode1 的行。对于这种情况,我想获取填充的行(对于上面示例中的 TypeA、KeyCode2 和 TypeB、KeyCode3)和不存在的行的空值。所以,输出如下:
10431, 3213X, 14318, BlahBlah
28659, , 6712X, NewBlah
最后一行永远不会显示,这就是问题所在,我希望所有现有数据都显示,不存在的行显示空字符串,如上。
谢谢。
【问题讨论】:
-
首先学会使用显式
JOIN语法。那就学用LEFT JOIN吧。 -
你有一张只列出数字的表格吗?如果所有值都丢失了怎么办?
-
WW:如果所有值都丢失,那么仍然只显示数字和带有 '' 的逗号表示空(丢失)。当然,数字总是在那里。
-
戈登·林诺夫:我不是很熟悉,你可以给我看一次吗?如果我没记错的话,我认为简单的 JOIN 就像对于 mn1、mn2、mn3 中的每一个的数字和值的许多不同的简单选择。关于Left Join,我还不是很擅长使用它,所以如果你能帮我一次,因为这对于许多类似的情况一定很有用。