Sql 具有不同值的自联接

Sql 具有不同值的自联接,sql,postgresql,join,distinct,postgresql-9.3,Sql,Postgresql,Join,Distinct,Postgresql 9.3,我有这张桌子: name code value -------------------------- | john | 0001 | 1 | | mary | 0001 | 2 | | mary | 0002 | 3 | 我希望实现的结果集如下所示: name code value -------------------------- | john | 0001 | 1 | | john

我有这张桌子:

   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
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
也可能是
NULL
,我真的需要它出现

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


有人能解释一下吗?

您还应该使用
名称
派生表,因为在您的方法中,应该与其相反(右键联接或用x替换t)不会为值返回空值

因此,首先必须创建一个派生表,其中包含
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)

将其设置为右连接(或在第二行上交换x和t:
select*from x left joint t on x.code=t.code
)@joop我以前尝试过,但没有成功。没问题,伙计:)@s.m。最后一件事:如果在原始表中还需要一个
date
列,该怎么办?我需要另一个交叉连接吗?如果您希望它执行与
名称
代码
相同的逻辑,那么是的@s、 好的,谢谢。我尝试添加另一个交叉连接,选择不同的日期,并在左侧连接条件中添加了日期,看起来它正在工作:)