【问题标题】:SQL return row as empty when Select for null value or row does not existSQL return row as empty when Select for null value or row does not exist
【发布时间】: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,我还不是很擅长使用它,所以如果你能帮我一次,因为这对于许多类似的情况一定很有用。

标签: sql oracle


【解决方案1】:

通过您的方法,您可以使用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)

【讨论】:

  • Gordon Linoff:谢谢,最后这很简单!工作正常。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2022-12-27
  • 2020-08-01
  • 1970-01-01
  • 1970-01-01
  • 2023-02-10
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多