2017-06-15 2 views
0

私はエンティティ属性値データベースのクエリを生成するのに数日間努力してきましたが、SQLを使って少し錆びました。私が望むのと全く同じようにクエリを実行することはできません。テーブルのEAVデータベースのクエリが多すぎる "ヌル"を生成する

重要な部分は、次のようになります。

 
ID | concept | modifier 
1 | abc:10 | @ 
2 | abc:22 | @ 
2 | abc:22 | t:f 
2 | abc:78 | @ 
2 | abc:78 | t:x 
3 | kfg:12 | @ 
4 | aqx:23 | @ 
5 | abc:49 | @ 
5 | abc:49 | t:f 
5 | abc:49 | t:g 

私はこのようなテーブルをしたい:

 
ID | concept | mod_f | mod_other 
1 | abc:10 | null | null 
2 | abc:22 | t:f | null 
2 | abc:78 | null | t:x 
5 | abc:49 | t:f | t:g 

私の試みは、この結果には、すでに私を得ました:

ここで

 
ID | concept | mod_f | mod_other 
1 | abc:10 | null | null 
2 | abc:22 | t:f | null 
2 | abc:22 | null | null 
2 | abc:78 | null | t:x 
2 | abc:78 | null | null 
5 | abc:49 | t:f | null 
5 | abc:49 | t:f | t:g 
5 | abc:49 | null | t:g 
5 | abc:49 | null | null 

私の結果を生成したコードは次のとおりです。

 
    SELECT t.ID, t.concept, t.modifier, 
     case when t.concept LIKE 'abc:%' and t.modifier = '@' then t.concept end AS "concept", 
     case when t2.modifier = 't:f' then t2.modifier end AS "mod_f", 
     case when t3.modifier LIKE 't:%' then t3.modifier end AS "mod_other" 
    FROM table as t 
    LEFT JOIN table as t2 ON t.ID = t2.ID and t.concept = t2.concept 
    LEFT JOIN table as t3 ON t2.ID = t3.ID and t2.concept = t3.concept 
    WHERE t.concept LIKE 'abc:%' and t.modifier = '@' and 
     (t2.modifier LIKE 't:f' or t2.modifier ='@')and 
     (t3.modifier = 't:g' or t3.modifier = 't:x' or t3.modifier ='@')
ORDER by t.ID asc;

は修正は簡単のようなものを見えるが、何でも私が試したことは、私は(基本的にあまりにも多くの行を削除したいものよりも結果が道以下に削減)この時点で私はもう何を探す必要があるのか​​分からない。

また、クエリーの「大文字小文字」部分は、(「@」を「null」にして)動作するため、どこかで見つけて使用したような汚れた解決策のように見えます。よりクリーンな質問、返信を自由にしてください。

+0

PRIMARY KEYは何ですか? – Strawberry

+0

これは、各行に同じ番号を保持するIDと別のIDであるため、この例ではこの2番目のIDについて言及しませんでした。 –

+0

PKを見るのはいつもいいことです。通常は、結合がない場合でも、データの構造についてのより良い考えが得られます。 – Strawberry

答えて

0

わかりました。私は答えを見つけ、私が思ったよりも簡単でした。

byは答えです。これはまさに私が探していたテーブルを、私を取得します

 
    SELECT t.ID, t.concept, t.modifier, 
     max(case when t.concept LIKE 'abc:%' and t.modifier = '@' then t.concept end) AS "concept", 
     max(case when t2.modifier = 't:f' then t2.modifier end) AS "mod_f", 
     max(case when t3.modifier LIKE 't:%' then t3.modifier end) AS "mod_other" 
    FROM table as t 
    LEFT JOIN table as t2 ON t.ID = t2.ID and t.concept = t2.concept 
    LEFT JOIN table as t3 ON t2.ID = t3.ID and t2.concept = t3.concept 
    WHERE t.concept LIKE 'abc:%' and t.modifier = '@' and 
     (t2.modifier LIKE 't:f' or t2.modifier ='@')and 
     (t3.modifier = 't:g' or t3.modifier = 't:x' or t3.modifier ='@') 
    GROUP by t.ID, t.concept, t.modifier 
    ORDER by t.ID asc; 

:私は、これは、テキストのために動作しませんが、あなたが実際にこのように最大でテキストケースselect文を集約することができます思いました。しかし、これは、のmod_otherに1コンセプトあたり1つのコードしか含まれていないために機能します。

関連する問題