代码之家  ›  专栏  ›  技术社区  ›  user46795

在T-SQL中不使用While或Cursor进行复制

  •  0
  • user46795  · 技术社区  · 16 年前
    ID           Name
    1            A
    1            B
    1            C
    2            X
    2            Y
    3            P
    3            Q
    3            R
    

    这些是表中的列。我想得到像这样的输出

    ID    Company
        1 A,B,C
        2 X, Y
        3 P,Q,R
    

    限制是我不能使用WHILE或CURSOR。请写一个相同的查询。

    4 回复  |  直到 16 年前
        1
  •  3
  •   marc_s MisterSmith    16 年前

    此查询应该使用它 FOR XML PATH SQL Server 2005中的新功能-希望您使用的是2005或更高版本,您没有明确指定。。。。。

    SELECT
        ID,
        STUFF(CAST((SELECT ','+Name FROM dbo.YourTable t2
                    WHERE t2.ID = dbo.YourTable.ID
                    FOR XML PATH(''), TYPE) AS VARCHAR(MAX)), 1, 1, '') AS 'Company'
    FROM 
       dbo.YourTable
    GROUP BY 
       ID
    
        2
  •  2
  •   Andomar    16 年前

    select id, sub.names
    from (
        select distinct id from YourTable
    ) a
    cross apply (
        select name + ', ' as [text()]
        from YourTable b
        where b.id = a.id
        for xml path('')
    ) sub(names)
    
        3
  •  1
  •   ceth    16 年前

    2005年版:

    CREATE TABLE dbo.TEST([Type] INTEGER, [Name] NVARCHAR(100), [Qty] INTEGER)
    GO
    INSERT dbo.TEST VALUES(1, N'a', 5)
    INSERT dbo.TEST VALUES(1, N'b', 6)
    INSERT dbo.TEST VALUES(2, N'c', 44)
    INSERT dbo.TEST VALUES(3, N'd', 1)
    GO
    
    select [Type],
     [Description] = replace((select [Name] + ':' + cast([Qty] as varchar) as 'data()'     
    from TEST where [Type] = t.[Type] for xml path('')), ' ', ',')
    from dbo.TEST t
    group by [Type]
    
    go
    
    drop table dbo.TEST
    
        4
  •  0
  •   Guffa    16 年前

    您可以在ID上分组以获取唯一值,然后使用 for xml 查询:

    select
      a.ID,
      substring((
        select ', ' + Name
        from Test1
        where Test1.ID = a.ID
        for xml path('')
      ), 3, 1000) as Company
    from
      TheTable a
    group by
      a.ID