SQL: выбор значений по имени столбца - PullRequest
1 голос
/ 30 июня 2019

Я бы хотел получить значения из таблицы, но ссылка - это имя столбца таблицы назначения вместо ключа - да, плохой дизайн. Если честно, я понятия не имею, с чего начать; не могли бы вы дать мне несколько советов, Пеласе?

Вот что у меня есть

Таблица «Источник»

ID | TargetField
---+-------------
 1 |   Field1   
 1 |   Field2   
 2 |   Field2   
 3 |   Field1   

Пересмотренная таблица:

ID | Field1 | Field2
---+--------+---------
 1 |   A    | B
 2 |   R    | C
 3 |   X    | D

Результат будет следующим:

ID | TargetField | Value
---+-------------+-------
 1 |    Field1   |   A  
 1 |    Field2   |   B  
 2 |    Field2   |   C  
 3 |    Field1   |   X  

Как сказано, понятия не имею, с чего начать ... Я смотрю на какой-то динамический SQL?

РЕДАКТИРОВАТЬ: пример довольно упрощен, поэтому switch / case не будет работать для меня. Я хотел бы перейти на динамический sql.

Ответы [ 2 ]

1 голос
/ 30 июня 2019

Вот один подход, который НЕ требует Динамического SQL.Тем не менее, я подозреваю, что динамический SQL и / или UNPIVOT будут более производительными.

  • При перекрестном применении B преобразует запись в XML

  • КроссApply C будет использовать XML B и UNPIVOT записать

  • Тогда присоединиться к исходной таблице по ID и Item

не так уж и сложно. Пример dbFiddle

Select A.[ID]
      ,C.*
 From  YourTable A
 Cross Apply ( values (cast((Select A.* for XML RAW) as xml))) B(XMLData)
 Cross Apply (
                Select Item  = xAttr.value('local-name(.)', 'varchar(100)')
                      ,Value = xAttr.value('.','varchar(max)')
                 From  XMLData.nodes('//@*') xNode(xAttr)
                 Where xAttr.value('local-name(.)','varchar(100)') not in ('Id','Other-Columns','To-Exclude')
             ) C
 Join Source D on A.ID=D.ID and C.Item=D.TargetField

Возвращает

ID  Item    Value
1   Field1  A
1   Field2  B
2   Field2  C
3   Field1  X
0 голосов
/ 30 июня 2019

Вы можете использовать выражение case:

select s.id,
       (case when s.targetfield = 'field1' then r.field1
             when s.targetfield = 'field2' then r.field2
        end)
from source s join
     referenced r
     on s.id = r.id;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...