gpt4 book ai didi

mysql - SQL 不同列和 Null

转载 作者:行者123 更新时间:2023-11-29 11:45:01 24 4
gpt4 key购买 nike

我试图在 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/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com