【问题标题】:SQL Distinct Columns and NullsSQL 不同的列和空值
【发布时间】:2016-01-29 19:25:06
【问题描述】:

我正在尝试对 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 个结果:

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 没有结果,我也需要表返回结果。

【问题讨论】:

  • 请显示您尝试的查询。此外,您对描述所做的任何澄清都会有所帮助。
  • 您能否发布有关您的数据库结构的更详细信息?包括更大的样本数据和期望输出。请阅读stackoverflow.com/help/how-to-ask这里是START的好地方
  • 我猜你样品上的L1, L2应该是你描述上的S1, S2
  • 道歉。用我尝试过的简单查询进行了更新。如果您愿意,我可以更新更多内容,但没有保存它们,因此我必须返回并重新创建它们。
  • 您的查询看起来正确。只需按条件添加订单。

标签: mysql sql join left-join


【解决方案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');

【讨论】:

    猜你喜欢
    • 2019-09-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-10-11
    • 1970-01-01
    • 2021-12-27
    相关资源
    最近更新 更多