2011-02-09 24 views
0

に保存されている列の名前を持つ一つのテーブルから取得した値は、私はいくつかのテーブルを持っています。これらはテーブルのやや簡略化されたバージョンです。SQL Serverの - 別のテーブル

 UsersTable: 
     UserId FirstName LastName MiddleInit Suffix Age Position 
     1 John  Graham  P.  Jr.  35  Analyst II 
     2 Bill  Allen  T.  III  45  Programmer I 
     3 Jenny  Smith  K.    25  Systems Engineer 
     4 Gina  Todd  J.    55  Analyst II 

    TableTypes: 
    TableTypeId TableType 
     1    Names 
     2    Positions 
     3    Age 

TableTypeIdはTableFieldsのTableTypesと外部キーの主キーです。

 TableFields: 
    FieldId TableTypeId FieldName Description 
    1   1   FirstName descr1 
    2   1   LastName  descr2 
    3   1   MiddleInit descr3 
    4   1   Suffix  descr4 

FieldIdは、TableFieldsの主キーであり、ModifiedUsersTableの外部キーです。

それは次のようになりますので、私はUsersTableからの値でModifiedUsersTableを入力する必要があり

 ModifiedUsersTable: 
    Id UserId  FieldId Value 
    1  1   1  John  
    2  1   2  Graham 
    3  1   3   P.   
    4  1   4   Jr. 
    5  2   1  Bill 

など

私はTableFieldsでフィールド名の欄に記載されていUsersTableから列のみを取得する必要があります表。私は、行数(fieldNames)または名前をTableFieldsで事前に知っていません。 PIVOTを使うべきだと思った。列名のカンマ区切り文字列を取得し、列に動的に変換できます。
しかし、それは私に必要なものを私に与えるようではありません。 ModifiedUsersTableをどのように埋めるのですか? 提案がありますか? ありがとう!

+0

を移入するためのスクリプトは、あなたのModifiedUsersTableは、ユーザーID列を持っていないでしょうか? – Lamak

+0

はい、ありがとうございますLamak – Boroda

+0

なぜこのデザインのテーブルをお持ちになりたいですか?特にあなたは今、完全に良いユーザーテーブルを持っているからですか?なぜEAVテーブルがしばしば非常に貧弱なデータベース設計テクニックであるのかを読んでおく必要があります。 – HLGEM

答えて

0

DDLデータ

create table UsersTable(
    UserId int, FirstName varchar(100), LastName varchar(100), MiddleInit varchar(100), 
    Suffix varchar(100), Age int, Position varchar(100)); 
insert UsersTable select 
'1','John','Graham','P.','Jr.','35','Analyst II' union all select 
'2','Bill','Allen','T.','III','45','Programmer I' union all select 
'3','Jenny','Smith','K.',null,'25','Systems Engineer' union all select 
'4','Gina','Todd','J.',null,'55','Analyst II'; 
create table tabletypes(
    TableTypeId int, TableType varchar(100)); 
insert tabletypes select 
1, 'Names' union all select 
2, 'Positions' union all select 
3, 'Age'; 

create table TableFields(
    FieldId int,TableTypeId int,FieldName varchar(100),Description varchar(100)); 
insert TableFields select 
'1','1','FirstName','descr1' union all select 
'2','1','LastName','descr2' union all select 
'3','1','MiddleInit','descr3' union all select 
'4','1','Suffix','descr4'; 

create table ModifiedUsersTable(
    Id int identity, userid int, fieldid int, value varchar(max)); 

ためModifiedUsersTable

declare @sql nvarchar(max) 
select @sql = coalesce(@sql+ ' 
    union all 
    ', '') + ' 
    select userid,' + right(FieldId,12) + ',' + quotename(fieldname) + ' 
    from userstable' 
from tablefields 
set @sql = @sql + ' 
    order by userid, 2' 

-- print @sql -- uncomment to see the generated SQL 
exec (@sql) 
関連する問題