Объединение с динамическими именами таблиц и столбцов - PullRequest
0 голосов
/ 04 июля 2019

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

Корень таблицы:

ID | Table   | Field
---+---------+-----------
 1 |   Tab1  | Field1  
 2 |   Tab2  | Field2  
 3 |   Tab1  | Field2
 4 |   Tab3  | Field4  
 5 |   Tab1  | Field1 

Tab1

ID | Field1  
---+---------
 1 |  A
 2 |  B  
 3 |  C  
 4 |  D  

Tab2

ID | Field1 |Field2
---+--------+-----------
 1 |   X    |   Bla
 2 |   Y    |   123
 3 |   Z    |   456

Tab3 не существует

Мне бы хотелось получить такой результат:

ID | Value
---+---------
 1 |  A
 2 |  123  
 3 |  NULL  -- Field does not match
 4 |  NULL  -- Tables does not exist
 5 |  NULL  -- ID does not exist

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

Моя начальная точкагде-то около Здесь , но это только для одной конкретной таблицы.Я не могу понять, как присоединиться динамически или, если это вообще возможно, без динамического sql, как exec.

1 Ответ

0 голосов
/ 04 июля 2019

Вы можете решить это с помощью выражения регистра и подзапросов, как в этом примере

declare @root table (id int, [table] varchar(10), Field varchar(10))
declare @tab1 table (id int, Field1 varchar(10))
declare @tab2 table (id int, Field1 varchar(10), Field2 varchar(10))

insert into @root (id, [table], Field)
values (1, 'Tab1', 'Field1'), (2, 'Tab2', 'Field2'), (3, 'Tab1', 'Field2'), (4, 'Tab3', 'Field4'), (5, 'Tab1', 'Field1')

insert into @tab1 (id, Field1)
values (1, 'A'), (2, 'B'), (3, 'C'), (4, 'D')

insert into @tab2 (id, Field1, Field2)
values (1, 'X', 'Bla'), (2, 'Y', '123'), (3, 'Z', '456')

select r.id,
       case when r.[Table] = 'Tab1' and r.Field = 'Field1' then (select t1.Field1 from @tab1 t1 where t1.ID = r.ID)
            when r.[Table] = 'Tab2' and r.Field = 'Field1' then (select t2.Field1 from @tab2 t2 where t2.id = r.id)
            when r.[Table] = 'Tab2' and r.Field = 'Field2' then (select t2.Field2 from @tab2 t2 where t2.id = r.id)
       end as Value
from   @root r

результат

id  Value   
--  ------- 
1   A   
2   123 
3   null    
4   null    
5   null    
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...