2015-03-06 8 views
0

гуру, У меня есть таблица, как показано нижеSQL SELECT Данные из другой таблицы на основе значения столбца

Id Name Source Value 
1 a  Dx C 
2 b  Rx G 
3 C  Tx H 

У меня 3 другие таблицы, как T1, T2 и T3 со структурой, как показано ниже. Основываясь на столбце «Источник» в родительской таблице, мне нужно получить «столбец данных» и показать результат. Если матч несколько записей нужно все записи, как запятая отделено

T1 

Id  Data 
Dx  123 
DX  011 
T2 

Id  Data 
Rx  456 
Rx  022 

T3 

Id  Data 
Tx  789  

мне нужен выход, как в T-SQL

Id Name Source Value Data 
1 a  Dx C  123,011 
2 b  Rx G  456 ,022 
3 C  Tx H  789 

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

+0

Любая комбинация слияния и левого соединения, или случай с подвыборками. – jarlh

+0

Вам нужно предоставить дополнительную информацию. Что определило, какая таблица должна быть удалена? Это ценности Source? Кажется, что это так, но было бы хорошо знать наверняка. – SchmitzIT

+0

Да в зависимости от значения источника данные должны быть заполнены – Saravanan

ответ

1

Попробуйте это:

DECLARE @t TABLE(ID INT, Name CHAR(1), Source CHAR(2), Value CHAR(1)) 
DECLARE @t1 TABLE(ID CHAR(2), Data NVARCHAR(20)) 
DECLARE @t2 TABLE(ID CHAR(2), Data NVARCHAR(20)) 
DECLARE @t3 TABLE(ID CHAR(2), Data NVARCHAR(20)) 

INSERT INTO @t VALUES 
(1, 'a', 'Dx', 'C'), 
(2, 'b', 'Rx', 'G'), 
(3, 'c', 'Tx', 'H') 

INSERT INTO @t1 VALUES('Dx', '1231') 
INSERT INTO @t1 VALUES('Dx', '1232') 
INSERT INTO @t1 VALUES('Dx', '1233') 
INSERT INTO @t2 VALUES('Rx', '4561') 
INSERT INTO @t2 VALUES('Rx', '4562') 
INSERT INTO @t3 VALUES('Tx', '789') 


SELECT t.ID , 
     t.Name , 
     t.Source , 
     t.Value , 
     COALESCE(c1.Data1, c2.Data2, c3.Data3) AS Data 
FROM @t t 
OUTER APPLY (SELECT STUFF((SELECT ',' + Data 
      FROM @t1 t1 WHERE t.Source = t1.ID 
      FOR XML PATH(''), TYPE 
      ).value('.', 'NVARCHAR(MAX)') 
     ,1,1,'') AS Data1) c1 
OUTER APPLY (SELECT STUFF((SELECT ',' + Data 
      FROM @t2 t2 WHERE t.Source = t2.ID 
      FOR XML PATH(''), TYPE 
      ).value('.', 'NVARCHAR(MAX)') 
     ,1,1,'') AS Data2) c2 
OUTER APPLY (SELECT STUFF((SELECT ',' + Data 
      FROM @t3 t3 WHERE t.Source = t3.ID 
     FOR XML PATH(''), TYPE 
     ).value('.', 'NVARCHAR(MAX)') 
    ,1,1,'') AS Data3) c3 

Выход:

ID Name Source Value Data 
1 a  Dx  C  1231,1232,1233 
2 b  Rx  G  4561,4562 
3 c  Tx  H  789 

Версия с CASE выражением:

SELECT t.ID , 
     t.Name , 
     t.Source , 
     t.Value , 
     o.Data 
FROM @t t 
     OUTER APPLY (SELECT CASE t.Source 
            WHEN 'Dx' THEN STUFF((SELECT 
                   ',' + Data 
                 FROM @t1 t1 
                 WHERE t.Source = t1.ID 
             FOR    XML PATH('') , 
                  TYPE 
      ).value('.', 'NVARCHAR(MAX)'), 1, 1, '') 
            WHEN 'Rx' THEN STUFF((SELECT 
                   ',' + Data 
                 FROM @t2 t2 
                 WHERE t.Source = t2.ID 
             FOR    XML PATH('') , 
                  TYPE 
      ).value('.', 'NVARCHAR(MAX)'), 1, 1, '') 
            WHEN 'Tx' THEN STUFF((SELECT 
                   ',' + Data 
                 FROM @t3 t3 
                 WHERE t.Source = t3.ID 
             FOR    XML PATH('') , 
                  TYPE 
     ).value('.', 'NVARCHAR(MAX)'), 1, 1, '') 
           END AS DATA 
        ) o 
+0

Большое спасибо .. Один маленький запрос: на основе значения только я могу выбрать таблицу ... Я имею в виду, если «dx», тогда t1, если «rx», то T2 и т. Д. Вы можете мне помочь с измененным запросом – Saravanan

+0

@ Сараванан, посмотрите версию дела. Это то, что вы хотите? –

+0

Отлично ... – Saravanan

0

Вам не нужно case, использовать вложенные ISNULL с или COALESCE и left outer joins:

Select tbl.Id, tbl.Name, tbl.Source, tbl.value, 
    isnull(isnull(T1.data,T2.data),T3.data) as data 
from table tbl 
left outer join T1 on tbl.Source = T1.Id 
left outer join T2 on tbl.Source = T2.Id 
left outer join T3 on tbl.Source = T3.Id 
Смежные вопросы