小编典典

将关联表展平为多值列?

sql

我有一张只包含产品ID和类别ID的表(产品可以在多个类别中)。如何将类别ID展平到产品列中,所以我以此结束:

id | name | desc | categories
1 | test1 | lorem | 1,3,4,23
2 | test2 | ipsom | 4,6,24

就像我需要循环到类别列的单独表中一样。我该怎么办?或者有更好的方法吗?


阅读 183

收藏
2021-03-23

共1个答案

小编典典

在MSSQL中没有内置的方法可以做到这一点。

没有真正简单的方法可以做到这一点。但是,有很多想法。

我找到的最好的一个:

SELECT table_name, LEFT(column_names , LEN(column_names )-1) AS column_names
FROM information_schema.columns AS extern
CROSS APPLY
(
    SELECT column_name + ','
    FROM information_schema.columns AS intern
    WHERE extern.table_name = intern.table_name
    FOR XML PATH('')
) pre_trimmed (column_names)
GROUP BY table_name, column_names;

或一个版本,如果数据中可能包含以下字符,则该版本可以正常工作: <

WITH extern
     AS (SELECT DISTINCT table_name
         FROM   INFORMATION_SCHEMA.COLUMNS)
SELECT table_name,
       LEFT(y.column_names, LEN(y.column_names) - 1) AS column_names
FROM   extern
       CROSS APPLY (SELECT column_name + ','
                    FROM   INFORMATION_SCHEMA.COLUMNS AS intern
                    WHERE  extern.table_name = intern.table_name
                    FOR XML PATH(''), TYPE) x (column_names)
       CROSS APPLY (SELECT x.column_names.value('.', 'NVARCHAR(MAX)')) y(column_names) 
2021-03-23