【问题标题】:Self-join with distinct values具有不同值的自联接
【发布时间】:2016-05-24 08:51:35
【问题描述】:

我有这张桌子:

   name    code     value
--------------------------
| john  |  0001  |    1   |
| mary  |  0001  |    2   |
| mary  |  0002  |    3   |

我想要实现的结果集如下所示:

   name    code     value
--------------------------
| john  |  0001  |    1   |
| john  |  0002  |  NULL  |
| mary  |  0001  |    2   |
| mary  |  0002  |    3   |

换句话说,我希望结果包含一行,其中code0002john,而表中缺少该行。

我原以为这样的事情会让我更接近:

with x as (select distinct code from t)
select * from t left join x on x.code = t.code

但我得到的基本上是同一张桌子:

   name    code     value    value1
-------------------------- --------
| john  |  0001  |    1   |    1   |
| mary  |  0001  |    2   |    2   |
| mary  |  0002  |    3   |    3   |

一些额外的想法使我得出结论,我的解决方案无论如何都不可能工作,因为name 也可能是NULL,我真的需要它出现。

我被难住了,这看起来比实际上容易。

谁能解释一下?

【问题讨论】:

  • 使其成为右连接(或在第二行交换 x 和 t :select * from x left joint t on x.code = t.code
  • @joop 我以前试过,但没用。

标签: sql postgresql join distinct postgresql-9.3


【解决方案1】:

您还应该使用NAMES 派生表,因为在您的方法中,它应该与实际相反(右连接或将 t 替换为 x)不会为该值返回空值。

因此,您首先必须创建一个包含 NAME|CODE 的所有可能选项的派生表,然后将其加入原始表。

SELECT t1.code,t2.name,t.value
FROM(SELECT DISTINCT code FROM t) t1
CROSS JOIN(SELECT DISTINCT name FROM t) t2
LEFT JOIN t
 ON(t2.name = t.name and t1.code = t.code)

【讨论】:

  • 没问题的伙伴 :) @s.m.
  • 最后一件事:如果我还需要原始表中的date 列怎么办?我需要另一个交叉连接吗?
  • 如果您希望它执行与 NAMECODE 相同的逻辑,那么是的。 @s.m.
  • 好的,谢谢。我尝试添加另一个选择不同日期的交叉连接并在左连接条件上添加日期,看起来它正在工作:)
猜你喜欢
  • 1970-01-01
  • 2022-10-02
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-06-07
  • 2019-03-19
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多