SQL不同的列和空值

时间:2016-01-29 19:25:06

标签: mysql sql join left-join

我试图在3个SQL表中的3个字段上保留外连接。目标是,在表T1中对象(O1)的查询中,表T2中有3个元素(E1,E2,E3),表T3中有2个次要特征(S1,S2),返回如下结果集: / p>

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

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

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

select a.O, b.E, c.S from T1 a left outer join T2 b on a.O = b.O left outer join T3 c on a.O = c.O where a.O in ('O1');

返回的结果将是:

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

注意:使用左外连接是因为我需要表返回结果,即使T2或T3没有结果。

1 个答案:

答案 0 :(得分:1)

我认为你想要做的就是对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。

如果你想在a中为多个对象执行此操作,那么只需添加以下内容

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');