当Select值为null或行不存在时,SQL返回行为空

时间:2016-02-25 01:48:34

标签: sql oracle

我的表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

最后一行永远不会显示,这是问题所在,我希望显示所有现有数据,并且不存在的行显示空字符串,如上所述。

谢谢。

1 个答案:

答案 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)