2016-05-24 21 views
1

我有這個表:自加入

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 | 

換句話說,我想要的結果爲john包含一行code0002,表中缺少該行。

我會想到這樣的事情會得到我更接近:

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,我真的需要它來顯示。

我很難過,這看起來比實際更容易。

任何人都可以點亮一下嗎?

+0

讓它右連接(或交換X和T在第二行:'SELECT * FROM X左接頭(T)上x.code = t.code') – joop

+0

@joop我嘗試過,但沒沒有工作。 –

回答

3

你也應該使用NAMES派生表,因爲在你的方法中,它應該與它是相反的(正確連接或用t替換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) 
+0

你是男人。奇妙的作品,非常感謝你! –

+0

沒問題的隊友:) @ s.m。 – sagi

+0

最後一件事:如果我還需要從原始表中找到一個「日期」列,該怎麼辦?我需要另一個交叉連接嗎? –