SQL Server - получение значений из одной таблицы с именами столбцов, хранящихся в другой таблице - PullRequest
0 голосов
/ 09 февраля 2011

У меня есть несколько таблиц. Это несколько упрощенные версии таблиц:

      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 является первичным ключом в TableTypes и внешним ключом в TableFields.

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

FieldId - это первичный ключ в TableFields и внешний ключ в ModifiedUsersTable.

Мне нужно заполнить ModifiedUsersTable значениями из UsersTable, чтобы она выглядела следующим образом:

       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

и т.д.

Мне нужно получить только те столбцы из UsersTable, которые перечислены в столбце FieldName в таблице TableFields. Я не знаю количество строк (fieldNames) или имена заранее в TableFields. Я думал, что я должен попытаться использовать PIVOT. Я могу получить строку имен столбцов через запятую и затем динамически преобразовать их в столбцы.
Но, похоже, это не дает мне то, что мне нужно. Как мне заполнить ModifiedUsersTable? Какие-либо предложения? Спасибо!

1 Ответ

0 голосов
/ 10 февраля 2011

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)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...