自我加入具有不同的价值观

时间:2016-05-24 08:51:36

标签: sql postgresql join distinct postgresql-9.3

我有这张桌子:

cv2.CAP_PROP_*

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

   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 | code 0002的{​​{1}}行,表格中缺少该行。

我原本以为这会让我更接近:

john

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

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,我真的需要它出现。< / p>

我很难过,这看起来比实际上容易。

任何人都能解释一下吗?

1 个答案:

答案 0 :(得分:3)

您还应该使用NAMES派生表,因为在您的方法中,它应该与它的相反(无论是右连接还是用x替换t)都不会返回值的空值。 / p>

因此,您首先必须创建一个包含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)