繁体   English   中英

SQL不同的列和空值

[英]SQL Distinct Columns and Nulls

我试图在3个SQL表中的3个字段上保留外部联接。 目标是,给定查询表T1中的对象(O1),并在表T2中具有3个元素(E1,E2,E3),在表T3中具有2个辅助特征(S1,S2),则返回如下结果集:

 O1 | E1 | S1
 O1 | E2 | S2
 O1 | E3 |

我将如何对多个对象执行此操作? 我尝试了左外部联接,分组依据以及不同SQL查询的组合,但似乎无法以太多组合的方式返回行。

这是我尝试过的最简单的示例,它返回6个结果:

select aO, bE, cS from T1 a left outer join T2 b on aO = bO left outer join T3 c on aO = cO where aO in ('O1');

返回的结果将是:

O1 | E1 | S1 O1 | E1 | S2 O1 | E2 | S1 O1 | E2 | S2 O1 | E3 | S1 O1 | E3 | S2

注意:之所以使用左外部联接,是因为即使T2或T3没有结果,我也需要表返回结果。

我认为您想要做的是像对待T2和T3一样下订单,然后将订单合并在一起。 您可以这样做:

select a.O, b.E, c.S
from T1 a 
left outer join (
  SELECT T2.*, ROW_NUMBER() OVER () as rn
  FROM T2     
) b on a.O = b.O 
left outer join (
  SELECT T3.*, ROW_NUMBER() OVER () as rn
  FROM T3 
) c on a.O = c.O and b.rn = c.rn
where a.O in ('O1');

如果T3的“元素”比T2多,则此方法将无效。

如果您要对中的多个对象执行此操作,则只需添加以下内容

select a.O, b.E, c.S
from T1 a 
left outer join (
  SELECT T2.*, ROW_NUMBER() OVER (PARTITION BY O) as rn
  FROM T2     
) b on a.O = b.O 
left outer join (
  SELECT T3.*, ROW_NUMBER() OVER (PARTITION BY O) as rn
  FROM T3 
) c on a.O = c.O and b.rn = c.rn
where a.O in ('O1');

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM