SQL Server 2012组列为一列

时间:2018-02-13 09:10:04

标签: sql-server

我有一个表HL_A,它以一对多的关系(HL_B)映射到HL_A.ID = HL_B.ID。然后HL_B以一对一(HL_C)关系映射到HL_B.ValudID = HL_C.ID

示例如下所示:

HL_A
╔════╤═════════════╗
║ ID │ ProductType ║
╠════╪═════════════╣
║ 1  │             ║
╚════╧═════════════╝

HL_B
╔════╤═════════╗
║ ID │ ValueID ║
╠════╪═════════╣
║ 1  │ 1       ║
╟────┼─────────╢
║ 1  │ 2       ║
╟────┼─────────╢
║ 1  │ 3       ║
╚════╧═════════╝

HL_C
╔════╤═════════╗
║ ID │ Product ║
╠════╪═════════╣
║ 1  │ A       ║
╟────┼─────────╢
║ 2  │ B       ║
╟────┼─────────╢
║ 3  │ C       ║
╚════╧═════════╝

我想将HL_A.ProductType更新为HL_C.Product列的串联。如下所示:

╔════╤═════════════╗
║ ID │ ProductType ║
╠════╪═════════════╣
║ 1  │ A, B, C     ║
╚════╧═════════════╝

但我的查询只生成一个值:

Update a
SET a.ProductType = STUFF((
        SELECT ', ' + CAST(c.Producte AS VARCHAR(255))
        FROM HL_C c
        WHERE c.ID = b.ValueId
        FOR XML PATH(''), TYPE
            ).value('.', 'NVARCHAR(MAX)')
        ,1,2,'')
FROM HL_A a
JOIN HL_B b
     ON a.ID = b.ID;

输出:

╔════╤═════════════╗
║ ID │ ProductType ║
╠════╪═════════════╣
║ 1  │ A           ║
╚════╧═════════════╝

环境是SQL Server 2012.你能帮忙吗?

3 个答案:

答案 0 :(得分:0)

请试试这个 - 你还应该检查你的设计???

解决方案

UPDATE a
SET a.ProductType = k.Pr
FROM 
HL_A a
INNER JOIN 
(
    SELECT u.ID , MAX(Pr) Pr
    FROM 
    (
        SELECT a.ID,STUFF((
                SELECT ', ' + CAST(c.Product AS VARCHAR(255))
                FROM HL_C c
                WHERE c.ID = b.ValueId
                FOR XML PATH(''), TYPE
                    ).value('.', 'NVARCHAR(MAX)')
                ,1,2,'') Pr
        FROM HL_A a
        JOIN HL_B b
             ON a.ID = b.ID
    )u GROUP BY u.ID 
)k ON k.ID = a.ID

SELECT * FROM HL_A
GO

<强>输出

ID          ProductType
----------- -----------
1           A, B, C

(1 row affected)

答案 1 :(得分:0)

可以通过以下代码段实现更新 -

declare @a table(id int,producttype varchar(10))
declare @b table(id int,valueid int)
declare @c table(id int,product varchar(10))
insert into @a values(1,'')
insert into @b values(1,1),(1,2),(1,3)
insert into @c values(1,'A'),(2,'B'),(3,'C')

Update a
SET a.ProductType =
STUFF((
        SELECT ', ' + CAST(c.product AS VARCHAR(255))
        FROM @c c inner join
        @b b on c.ID = b.ValueId
        FOR XML PATH(''), TYPE
            ).value('.', 'NVARCHAR(MAX)')
        ,1,2,'')
from @a a 
inner join @b b1
on a.id = b1.id

select * from @a

答案 2 :(得分:0)

感谢其他人回答,但他们都没有工作。最后,我实现了这样的目标:

Update a
SET a.ProductType = STUFF((
        SELECT ', ' + CAST(c.Product AS VARCHAR(255))
        FROM HL_C c
        WHERE c.ID IN (SELECT ValueID FROM HL_B WHERE ID = b.ID)
        FOR XML PATH(''), TYPE
            ).value('.', 'NVARCHAR(MAX)')
        ,1,2,'')
FROM HL_A a
JOIN HL_B b
     ON a.ID = b.ID;