我的表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
我需要在表格中选择所有数字并显示它们的值,即使该值为空或该行不存在(例如上面没有带有ParameterName = KeyCode2的行的数字28659。请注意另一个与上述数字不同,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
最后一行永远不会显示,这是问题所在,我希望显示所有现有数据,并且不存在的行显示空字符串,如上所述。
谢谢。
答案 0 :(得分:0)
根据您的方法,您可以使用LEFT JOIN
:
select mn1.Number, mn1.Value, mn2.Value, mn3.Value
from MyNumbers mn1 left join
MyNumbers mn2
on mn2.Number = mn1.Number and
mn2.ServiceName = 'TypeA' and
mn2.ParameterName = 'KeyCode2'left join
MyNumbers mn3
on mn3.Number = mn1.Number and
mn3.ServiceName = 'TypeB' and
mn3.ParameterName = 'KeyCode3'
where mn1.ServiceName = 'TypeA' and
mn1.ParameterName = 'KeyCode1';
实际上,这需要第一栏中的内容。如果你有一个数字表,那么:
select mn1.Number, mn1.Value, mn2.Value, mn3.Value
from Numbers n left join
MyNumbers mn1
on n.Number = mn1.Number and
mn1.ServiceName = 'TypeA' and
mn1.ParameterName = 'KeyCode1' left join
MyNumbers mn2
on mn2.Number = n.Number and
mn2.ServiceName = 'TypeA' and
mn2.ParameterName = 'KeyCode2' left join
MyNumbers mn3
on mn3.Number = n.Number and
mn3.ServiceName = 'TypeB' and
mn3.ParameterName = 'KeyCode3';
如果您希望至少有一列拥有数据,则可能需要添加where mn1.Number is not null or mn2.Number is not null or mn3.Number is not null
。
此外,Numbers
表格可以替换为(select distinct Number from MyNumbers)
。