具有不同值的自连接
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 |
换句话说,我希望结果包含 code
为 0002
的行 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)
我有这个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 |
换句话说,我希望结果包含 code
为 0002
的行 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)