以逗号分隔列表形式返回 SQL 数据

标签 sql sql-server sql-server-2000

这是我的表格:

-----------------------------------------
Hotels
-----------------------------------------
HotelID | HotelName
-----------------------------------------


-----------------------------------------
HotelImages
-----------------------------------------
HotelImageID | HotelID | Filename
-----------------------------------------

我想创建一个 SELECT 语句来返回数据,如下所示:

HotelID | HotelName | Images
-----------------------------------------
1 | Hotel1 | Image1,Image2,Image3
2 | Hotel2 | Image4,Image5,Image6

如何修改我的查询来执行此操作?我有:

SELECT H.HotelID, H.HotelName, '' AS Images
FROM Hotels H

我知道我可以使用 COALESCE 创建逗号分隔列表:

DECLARE @Images varchar(500)
SELECT @Images = COALESCE(@Images + ',', '') + CAST(Filename AS varchar(100)) FROM HotelImages WHERE HotelID = 1
SELECT @Images

但我不知道如何将其集成到我当前的查询中,以便可以将列表与其余酒店数据一起返回。

我应该提到我正在使用 SQL Server 2000。

最佳答案

由于这是 SQL 2000,您的选择有些有限。您不能使用 FOR XML PATH 或递归 CTE

此外,COALESCE 技巧仅适用于填充单个酒店的逗号分隔列表。不是所有的人。

老实说,您最好在客户端中执行此操作。但如果无法做到这一点(想到某些不得命名的报告应用程序),您可以执行以下操作。

注意循环过程的次数等于与酒店关联的最大文件数。这比为每个酒店设置一个循环(例如从 select 子句中调用 UDF)要好得多。

DECLARE @foo table ( HotelID int , lastID int , FileNameList varchar(8000))

INSERT INTO @Foo 

SELECT
    start.HotelID,
    start.firstID ,
    id.FileName 

FROM
    (SELECT 
        HotelID,
        min(HotelImageID ) firstID
    from 
        HotelImages


    group by HotelID) start
    INNER JOIN HotelImages hi
    ON start.firstID = hi.HotelImageID 


WHILE @@RowCount <> 0 
BEGIN

    UPDATE @foo
    SET 
        FileNameList = FileNameList + ',' + FileName
        lastID  = Xnext.nextID
    FROM 
        @foo f
        INNER JOIN HotelImages hi
        ON f.HotelID = id.HotelID
        INNER JOIN 
        (SELECT 

            id.HotelID,
            min(HotelImageID ) nextID
        from HotelImages hi
              inner join @foo f
              on f.HotelID = id.HotelID
        where id.HotelImageID  > f.lastid


        group by id.HotelID) Xnext

        ON Xnext.nextID = id.HotelImageID 



END 

SELECT 
    h.HotelID 
    h.HotelName,
    f.FileNameList
FROM
    Hotels h
    INNER JOIN @foo f
    ON h.hotelId = f.HotelId

关于以逗号分隔列表形式返回 SQL 数据,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4494282/

相关文章:

sql - 选择查询重复值

sql-server - 查询中包含函数吗?

sql - 组织 SQL 批处理语句

sql - 使用给定模式在 Postgres 中生成列

sql - SELECT * 其中所有 integer[] 单元格都在一组值中

mysql - 获取没有开放结束日期的所有项目

php - Codeigniter 中的多连接数据库

mysql - 如何编写可以得到以下结果的 SQL 查询?

sql - MySQL 结果按两个值分组

SQL 按隔年排序