1

私はこの次の表があります。また、SQL SELECTから、私の以前の質問に基づいてEAVテーブル

IrisColor 
    ID Description 
    1 Blue 
    2 Gray 
    3 Green 
    4 Brown 

SkinColor 
    ID Description 
    1 White 
    2 Asian 
    3 Dark  

Gender 
    ID Description 
    1 Male 
    2 Female 

と属性テーブル

Attributes 
    ID Description 
    1 SkinColor 
    2 IrisColor 
    3 Gender 

そしてEAVテーブル:

PersonDetails 
    PersonID AttributeID ValueID 
    121  1   1 
    121  2   2 
    121  3   1 
    122  1   2 
    122  2   1 
    122  3   1 

名前、SkinColorだけの属性名と値を選択したい場合は、次のようにします:

SELECT p.Name, 
     a.Description, 
     v.Description 
     FROM PersonDetails AS sd 
     INNER JOIN Subjects AS p ON sd.PersonID=p.ID 
     INNER JOIN SubjectAttributes AS a ON sd.AttributeID=a.ID 
     INNER JOIN SkinColor AS v ON sd.ValueID= v.ID 

しかし、どうすればよいですかデータベースのすべての人物のすべての情報を選択するには、肌色だけでなく、虹彩の色や性別も選択しますか?

以前私はSkinColorからその値を選択したいと思っていましたが、PersonDetailsではIrisColorとGenderの値も持っていました。

INNER JOIN SkinColor AS v ON sd.ValueID = v.IDこれはもはや適切ではありません。どのようにこれをよりダイナミックなものに置き換えるのですか?

更新:

私はこの文を使用:

SELECT 
    SubjectID, 
    SkinColor, 
    IrisColor, 
    EyeLidFlisure, 
    KnownEyeDeffect, 
    Ethnicity, 
    Height, 
    DrivingLicense, 
    Gender 
FROM 
(
SELECT SubjectID, attr.Description as attribute, ValueID from SubjectDetails, SubjectAttributes as attr WHERE SubjectDetails.AttributeID=attr.ID 
) as t 
PIVOT(MAX(ValueID) FOR attribute IN (SkinColor,IrisColor,Gender,EyeLidFlisure,KnownEyeDeffect,Ethnicity,Height,DrivingLicense)) AS t1 

、私は別々の列にリストされているすべての属性を持っていますが、代わりに値の記述の私は価値IDを持っています。私はどのように続けるべきですか?

+0

ピボットEAV正規テーブルPersonDetailsT(PersonID、SkinColor、IrisColor、ジェンダー...)、それを適切なテーブルに結合します。ピボットはDBMS固有で、DBMSに正しくタグ付けします。 – Serg

+0

あなたは結合部分についてもう少し具体的になることができますか?それはまさに私の問題です。 – berthos

+0

あなたのDBMSは何ですか? – Serg

答えて

0

を辞書(かどうかを知りません

WITH Subject AS (

SELECT 
    SubjectID, 
    SkinColor, 
    IrisColor, 
    EyeLidFlisure, 
    KnownEyeDeffect, 
    Ethnicity, 
    Height, 
    DrivingLicense, 
    Gender 
FROM 
(
SELECT SubjectID, attr.Description as attribute, ValueID from SubjectDetails, SubjectAttributes as attr WHERE SubjectDetails.AttributeID=attr.ID 
) as t 
PIVOT(MAX(ValueID) FOR attribute IN (SkinColor,IrisColor,Gender,EyeLidFlisure,KnownEyeDeffect,Ethnicity,Height,DrivingLicense)) AS t1 
) 

SELECT SubjectID, 
whole.Name as Name, 
whole.eMail as eMail, 
skincolor.Description as SkinColor, 
iriscolor.Description as IrisColor, 
eyelid.Description as EyeLidFlisure, 
defect.Description as KnownEyeDeffect, 
eth.Description as Ethnicity, 
height.Description as Height, 
dl.Description as DrivingLicense, 
gender.Description as Gender 

FROM Subject S 
Left JOIN Subjects whole ON whole.ID=S.SubjectID 
Left JOIN SkinColor skincolor ON S.SkinColor=skincolor.ID 
Left JOIN IrisColor iriscolor ON S.IrisColor=iriscolor.ID 
Left JOIN EyeLidFlisure eyelid ON S.EyeLidFlisure=eyelid.ID 
Left JOIN KnownEyeDeffect defect ON S.KnownEyeDeffect=defect.ID 
Left JOIN Ethnicity eth ON S.Ethnicity=eth.ID 
Left JOIN Height height ON S.Height=height.ID 
Left JOIN DrivingLicense dl ON S.DrivingLicense=dl.ID 
Left JOIN Gender gender ON S.Gender=gender.ID 
1

適切な外部キーの関係を持つことができない「人の詳細」テーブルにIDがあるため、データモデルは少し秘密です。 すべての属性を同じテーブルに入れることができます。あるいは、各属性ごとに別個のテーブルを持つこともできます。または、EAVモデルに共通するように、説明をPersonDetailsに直接入力します。

あなたはこのような何かをする必要があるとしている。

SELECT p.Name, 
     sa.Description, 
     ic.Description as IrisColor, 
     g.Description as gender 
FROM PersonDetails sd INNER JOIN 
    Subjects p 
    ON sd.PersonID = p.ID INNER JOIN 
    SubjectAttributes sa 
    ON sd.AttributeID = sa.ID 
    ON LEFT JOIN 
    SkinColor sc 
    ON sd.ValueID = sc.ID AND sa.Description = 'SkinColor' LEFT JOIN 
    IrisColor ic 
    ON sd.ValueId = ic.ID AND sa.Description = 'IrisColor' LEFT JOIN 
    Gender g 
    ON sd.ValueId = g.ID AND sa.Description = 'Gender'; 
1

あなたは属性から構築された動的SQLを必要とするの推測では、これは完全な解決策になる

declare @sql varchar(max)= 
    'select PersonID , ' + 
    + stuff((select ','+Description + '.Description as ' + Description 
      from Attributes 
     for xml path ('')),1,1,'') 
    + ' from (select PersonID, ' 
    + stuff((select ',max(case AttributeID when ' + cast(ID as varchar(5)) +' then ValueID end) as ' + Description 
     from Attributes 
     for xml path ('')),1,1,'') 
    +' from PersonDetails group by PersonID) pvt' 
    + (select ' left join ' + Description + ' on pvt.' + Description + ' = '+ Description + '.ID' 
     from Attributes 
     for xml path ('')); 

exec (@sql); 
関連する問題