Извлеките данные из таблицы 2, используя имена столбцов, хранящиеся в таблице 1

#sql-server

Вопрос:

Я хочу иметь возможность просматривать значения полей из вторичной таблицы, в которой имена полей вторичной таблицы хранятся в виде строк в первичной таблице.

Я пытаюсь одновременно запросить саму первичную таблицу, чтобы получить имена полей, которые я хочу, из вторичной таблицы:

Как я могу использовать эту строку, содержащую имя поля, для выбора данных из таблицы2, учитывая идентификатор определенной строки.

Случай использования здесь заключается в том, что таблица 1 также содержит поле примечания. Я хочу заполнить это поле примечания содержимым определенной записи в таблице 2. Я хочу сделать это для всех записей в таблице 1: каждая запись ссылается на другое поле по имени поля.

Другой способ взглянуть на это: в таблице 2 есть 1 строка, из которой нам нужны данные, и мы знаем, что в таблице ID1 хранится список полей, для которых нам нужны данные из таблицы 2. Как я могу получить оба фрагмента данных (имя поля и значение поля), используя эти ограничения?

все данные являются переменными

таблица 1

имя поля Внешний вид
MyField1 001
Мое поле 2 001

таблица 2

ID MyField1 Мое поле 2 Мое поле 3
001 myField1ValueForID001 myField2ValueForID001 myField3ValueForID001
002 моредата1 моредата2 подробнее 3
 select fieldname,
(select [fieldname] from table2 where id = ) as fieldData
from table1
 

Результат

имя поля fieldData
MyField1 MyField1
Мое поле 2 Мое поле 2

желаемый результат

имя поля fieldData
MyField1 myField1ValueForID001
Мое поле 2 myField2ValueForID001

Комментарии:

1. Данные в понятном формате помогут нам помочь вам. Лучше всего было бы опубликовать его как DDL и DML, но, по крайней мере, в хорошо отформатированном табличном text формате .

Ответ №1:

Вы можете сделать это с CASE помощью выражения, хотя я рекомендую вам пересмотреть свой дизайн здесь:

 SELECT *
INTO dbo.Table1
FROM (VALUES('myField1','001'),
            ('myField2','001'))V(FieldName,ExternalID);

SELECT *
INTO dbo.Table2
FROM (VALUES('001','myField1ValueForID001','myField2ValueForID001','myField3ValueForID001'),
            ('002','moredata1','moredata2','moredata3'))V(id,myField1,myField2,myField3);
GO

SELECT T1.FieldName,
       CASE T1.FieldName WHEN 'myField1' THEN T2.myField1
                         WHEN 'myField2' THEN T2.myField2
                         WHEN 'myField3' THEN T2.myField3
       END AS FieldData
FROM dbo.Table1 T1
     JOIN dbo.Table2 T2 ON T1.ExternalID = T2.id;

GO

DROP TABLE dbo.Table1;
DROP TABLE dbo.Table2;