0

私は古典的な人物 - >人物属性スキームを持っています。したがって、次のようになります: person(PK) <- person_attribute(FK)

私が必要としているのは、人物が属性と結合されている 1 つの行を取得するクエリです。たとえば、次のように変換します。

Person:
{ ID = 123456, Name = 'John Smith', Age = 25 }
Attributes:
1) { PersonID = 123456, AttributeTypeID = 'Height', AttributeValue = '6'6'''}
2) { PersonID = 123456, AttributeTypeID = 'Weight', AttributeValue = '220lbs'}
3) { PersonID = 123456, AttributeTypeID = 'EyeColor', AttributeValue = 'Blue'}

に:

PersonWithAttributes
{
 ID = 123456, Name = 'John Smith', Age = 25, Height = '6'6''', Weight = '220lbs', EyeColor = 'Blue'
}

さらに悪いことに、私の人物はテーブル変数にあります。

だから、私は(person_idのパラメータを持つspで)持っています:

--result table
declare @people_info table
(
person_id int,
name nvarchar(max),
age int,
height nvarchar(10) null,
weight nvarchar(10) null,
eye_color nvarchar(16) null
)


insert into @people_info
 select person_id, name, age, null, null, null
  from dbo.HR.people where person_id = @person_id

update pi
 set
  pi.height = (select pa.attribute_value where pa.attribute_type_id = 'Height'),
  pi.height = (select pa.attribute_value where pa.attribute_type_id = 'Weight'),
  pi.eye_color = (select pa.attribute_value where pa.attribute_type_id = 'EyeColor')
 from
  @people_info pi
   inner join dbo.HR.person_attributes pa on pi.person_id = pa.person_id

select * from @people_info

もちろん、何らかの理由で機能しません。結合された 2 つのテーブルに対してクエリを実行し、「pa.attribute_value where pa.attribute_type_id = 'someval'」を選択すると、正しい値が得られます。しかし、更新は機能しません。

もちろん、これを 3 つの更新として書くこともできますが、1 つの結合を行ってから update 句でフィルター処理する方が高速になると考えています。

また、私の属性は、属性テーブルだけでなく、3 つのテーブルに分散していることにも注意してください。だから、これが私がテーブル変数を持っている理由です。

どんな助けでも大歓迎です。多分私はこれについて間違った方法で進んでいます。パフォーマンスが重要です。これを達成するための最もパフォーマンスの高い方法は何ですか?

どうもありがとうございました。

4

2 に答える 2

1

ピボットで更新するには、次のコードを試してください。

    update 
        pi
    set
        pi.height = pa.Height
        pi.weight = pa.Weight
        pi.eye_color = pa.EyeColor
    from
        @people_info pi
    inner join 
        (
            SELECT
                 person_id
                ,[Height] Height
                ,[Weight] Weight
                ,[EyeColor] EyeColor
            FROM
            (
                SELECT
                      attribute_type_id
                    , attribute_value
                    , person_id   
                FROM
                    dbo.HR.person_attributes pa
            ) pa
            PIVOT
            (
                MAX(attribute_value) FOR attribute_type_id IN ([Height],[Weight],[EyeColor])
            )pvt

        ) pa
    on 
        pi.person_id = pa.person_id
于 2012-10-23T08:22:58.100 に答える
1

多分あなたは次のようなものが欲しい:

update pi 
 set 
  pi.height = paH.attribute_value,
  pi.weight = paW.attribute_value,
  pi.eye_color = paE.attribute_value
 from 
  @people_info pi 
   inner join dbo.HR.person_attributes paH on pi.person_id = paH.person_id 
                                            and paH.attribute_type_id = 'Height'
   inner join dbo.HR.person_attributes paW on pi.person_id = paW.person_id 
                                            and paW.attribute_type_id = 'Weight'
   inner join dbo.HR.person_attributes paE on pi.person_id = paE.person_id 
                                            and paE.attribute_type_id = 'EyeColor'
于 2012-10-22T18:30:03.500 に答える