mysql - SQL 不同列和 Null

标签 mysql sql join left-join

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

相关文章:

mysql - 如何根据每个 id 更新所有行

mysql - 将两个单独的联接合并到一个查询中

MySQL 触发器 concat 与 curdate()

sql - 来自表的多级聚合

mysql - 如何将这 3 个 mySQL 查询合并为一个?

php - 绝望于复杂的连接查询(mysql & php)

PHP foreach 循环使用排除某些结果的值填充下拉列表

mysql - mysql 中的派生表显示错误

php - 值未插入表中

mysql - 如何设计表架构来存储 <select multiple> 中的值