TSQL如何在连接内部水平连接,

时间:2016-07-19 16:10:59

标签: sql-server tsql

我有这个任务在示例中显示CodeName,并且可能有多个代码用逗号分隔,我尝试使用xml解析但看起来有点不同的情况。在下面的示例代码中,我以简单的方式完成了它,但也许有更好的方式更灵活:  我还在照片中包含了所需的输出。 Sample of desired output click here

WITH cte1 AS (
SELECT 'Alpha' Name,  'AA' Code  UNION
SELECT 'Bravo' Name,  'AA,BB,CC' Code  UNION
SELECT 'Whiskey' Name,  NULL Code),
 cteLookup AS (
SELECT 'AA' CodeID,  'Avia' CodeName  UNION
SELECT 'BB' CodeID,  'Bahamas' CodeName  UNION
SELECT 'CC' CodeID,  'Chile' CodeName  )


SELECT Name,
       Code,
       SUBSTRING(Code,1,2) c1,
       x1.CodeName + ', ' +  ISNULL(x2.CodeName,'') + ', ' +   ISNULL(x3.CodeName,'')  
FROM Cte1 
LEFT JOIN cteLookup x1  ON x1.CodeID =  SUBSTRING(Code,1,2)
LEFT JOIN cteLookup x2  ON x2.CodeID =  SUBSTRING(Code,4,2)
LEFT JOIN cteLookup x3  ON x3.CodeID =  SUBSTRING(Code,7,2)

1 个答案:

答案 0 :(得分:2)

WITH cte1 AS (
SELECT 'Alpha' Name,  'AA' Code  UNION
SELECT 'Bravo' Name,  'AA,BB,CC' Code  UNION
SELECT 'Whiskey' Name,  NULL Code),
 cteLookup AS (
SELECT 'AA' CodeID,  'Avia' CodeName  UNION
SELECT 'BB' CodeID,  'Bahamas' CodeName  UNION
SELECT 'CC' CodeID,  'Chile' CodeName  )

--

SELECT
     A.Name,
     A.Code,
     LEFT(A.CodeName, LEN(A.CodeName) - 1) AS CodeName
FROM
(
    SELECT
        C.Name,
        C.Code,
        (       
            SELECT 
                CL.CodeName + ', ' 
            FROM                
                cteLookup CL
            WHERE 
                C.Code LIKE '%' + CL.CodeID + '%'
            FOR XML PATH ('')
        ) AS CodeName

    FROM
        Cte1 C
) A

输出

Name    Code     CodeName
------- -------- -------------------------
Alpha   AA       Avia
Bravo   AA,BB,CC Avia, Bahamas, Chile
Whiskey NULL     NULL