繁体   English   中英

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

[英]Self-join with distinct values

我有这张桌子:

   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   |

换句话说,我希望结果包含johncode0002的行,表中缺少该行。

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

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

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

任何人都能解释一下吗?

您还应该使用NAMES派生表,因为在您的方法中,它应该与它的相反(无论是右连接还是用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)

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM