[英]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.