簡體   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