我试图在 3 个 SQL 表中的 3 个字段上保留外部联接。目标是,给定查询表 T1 中的对象 (O1)、表 T2 中的 3 个元素(E1、E2、E3)和表 T3 中的 2 个次要特征(S1、S2),返回一个结果集,如下所示:
O1 | E1 | S1
O1 | E2 | S2
O1 | E3 |
我该如何对多个对象执行此操作?我尝试过左外连接、分组依据以及不同 SQL 查询的组合,但似乎无法以没有太多组合的方式返回行。S
这是我尝试过的最简单的示例,它返回 6 个结果:
从中选择 a.O、b.E、c.S
T1a
a.O = b.O 上的左外连接 T2 b
a.O = c.O 上的左外连接 T3 c
其中a.O 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,则此方法将不起作用。
如果您想对 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');
关于mysql - SQL 不同列和 Null,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35092466/