私は古典的な人物 - >人物属性スキームを持っています。したがって、次のようになります: 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 つのテーブルに分散していることにも注意してください。だから、これが私がテーブル変数を持っている理由です。
どんな助けでも大歓迎です。多分私はこれについて間違った方法で進んでいます。パフォーマンスが重要です。これを達成するための最もパフォーマンスの高い方法は何ですか?
どうもありがとうございました。