2016-05-24 8 views
1

で自己結合:私はしたい、つまり私はこのテーブルを持っている別個の値

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

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

私が達成したいと思いますこれは何のように見える結果セットです結果はの0002johnの行を含んでいますが、これはテーブルにはありません。

私はこのような何かが近い私を得ているだろうと思っているだろう。いくつかの追加的な思考は、その結論に私をもたらした

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

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

が、どのような私が手を本質的に同じテーブルでありますnameもおそらくNULLであろうから、私の解決策はとにかくうまくいかないだろう。

私は困惑していますが、これは実際よりも簡単です。

誰でも光を当てることはできますか?

+0

それ右が参加(または交換xとt二行目: 'x.code = t.code'上のx左共同トンから選択*)してください、私は前に試した – joop

+0

@joopが、それはdidnの仕事はありません。 –

答えて

3

また、NAMES派生テーブルを使用する必要があります。これは、メソッド内で逆の値にする必要があります(右ジョインまたはtをxに置き換える)ので、null値は返されません。

したがって、可能なすべてのオプションを含む派生テーブルを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

もう一つ最後のもの:元のテーブルから必要な 'date'カラムがあったらどうしますか?私は別のクロス参加が必要でしょうか? –

関連する問題