#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;