简体   繁体   English

基于列值的其他表中的SQL SELECT数据

[英]SQL SELECT Data from other table based on column value

Gurus, I have a table like below 上师,我有一张下面的桌子

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

I have 3 other tables like T1,T2 and T3 with structure as below. 我还有其他3个表,例如T1,T2和T3,其结构如下。 Based on "Source" column in parent table, I need to fetch "Data column" and show as result. 基于父表中的“源”列,我需要获取“数据列”并显示为结果。 If multiple records match need all record as comma-seperated 如果多个记录匹配,则所有记录都以逗号分隔

T1

Id       Data
Dx        123
DX        011  
T2

Id       Data
Rx        456
Rx       022  

T3

Id       Data
Tx        789     

I need Output as in T-SQL 我需要像T-SQL中的输出

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

I tried with Case when but not successful. 当没有成功时,我尝试了Case。 Need inputs 需要输入

Try this: 尝试这个:

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   

Output: 输出:

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

Version with CASE expression: 带有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

you don't need to case , use nested ISNULL s or COALESCE and left outer joins : 您无需case ,可以使用嵌套的ISNULLCOALESCE并使用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

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

相关问题 SQL查询根据另一个表中的列值从一个表中选择 - SQL query to select from one table based on a column value in other table 如何基于其他表中的其他关系从1列中选择2个数据 - How to select 2 data from 1 column based on other relations in other table SQL查询基于列值从3个选项中选择并从其他表中选择 - SQL query to select out of 3 options and from other table, based on column value SQL从其他表中选择具有相应值的列 - SQL select column from other table with corresponding value 如何根据同一表列中的值在SQL中进行SELECT? - How to SELECT in SQL based on a value from the same table column? SQL根据列值从表中选择x行数 - SQL select x number of rows from table based on column value SQL Server-根据一个字符串值从一个表中选择数据 - SQL Server - Select data from one table based on a string value 如何基于SQL Server中当前表列的值使用与其他表不同的列值 - How to use different column values from other table based on value on current table column in SQL server 使用基于其他列alter table sql的值的值填充列 - populate a column with a value based on value of other column alter table sql SQL基于与其他表的联接,从同一表中选择两行(实际上是同一列) - SQL select two rows from same table (same column, in fact), based on join with other table
 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM