具有不同值的自连接

Self-join with distinct values

我有这个table:

   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   |

换句话说,我希望结果包含 code0002 的行 john,table 中缺少该行。

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

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

但我得到的结果基本相同table:

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

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

我很困惑,这看起来比实际更容易。

任何人都可以解释一下吗?

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

所以你首先必须制作一个包含 NAME|CODE 所有可能选项的派生 table ,然后将它加入你原来的 table.

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)