【问题标题】:Get comma separated list of values - SQL [duplicate]获取逗号分隔的值列表 - SQL [重复]
【发布时间】:2015-01-01 06:53:27
【问题描述】:

产品

-----------------------------
| ProductId | ModelId       |
|---------------------------|
| 12345     | A3666         |
| 12345     | A3667         |
| 12345     | A8999         |
| 12346     | A3666         |
| 12346     | A3667         |
-----------------------------

模型

-----------------------------
| ModelId   | Name          |
|---------------------------|
| A3666     | win           |
| A3667     | xia           |
| A8999     | vor           |
-----------------------------

我正在尝试以这种方式获取输出:

-----------------------------------
| ProductId | Models              |
|---------------------------------|
| 12345     | win,xia,vor         |
| 12346     | win,xia             |
-----------------------------------

我的代码是:

SELECT
    p.ProductId,
    STUFF
    (
        (
            SELECT ',' + Name
            FROM models m
            WHERE m.ModelId=p.ModelId
            ORDER BY Name
            FOR XML PATH(''), type
        ).value('.', 'varchar(max)'), 1, 1, ''
    ) AS ModelNames
FROM
    products p

给出 o/p :

-----------------------------
| ProductId | ModelNames    |
|---------------------------|
| 12345     | win           |
| 12345     | xia           |
| 12345     | vor           |
| 12346     | win           |
| 12346     | xia           |
-----------------------------

我哪里错了。 [我认为这个问题很清楚,可以理解,但 SO 不会像它所说的那样提交,添加更多细节,主要是代码。所以这个文本。]

【问题讨论】:

  • @Querty 您面临的错误是什么。
  • 没有错误。只是不是你想要的 o/p,如果你看到了..
  • 我不知道为什么人们如此痴迷于使用 CSV 将数据传入和传出 SQL Server。 SQL Server 至少有两种数据类型(表和 xml),设计 用于保存多个值。与字符串不同,您必须编写各种奇怪的代码来构造它们(如这里)或将它们分开以获取值。并丢失您可能有用地获得的任何数据类型检查。

标签: sql tsql sql-server-2012


【解决方案1】:

我认为这应该可以解决您的问题。

SELECT DISTINCT
    p.ProductId,
    STUFF
    (
        (
            SELECT ',' + m.Name
            FROM models m
            INNER JOIN products ip
            ON m.ModelId = ip.ModelId
            WHERE ip.ProductId = p.ProductId
            ORDER BY p.ModelId
            FOR XML PATH('')
        ), 1, 1, ''
    ) AS ModelNames
FROM products p

【讨论】:

  • 复制逗号分隔值 - 例如 12345 - win,xia,vor,win,xia,vor
  • 我在我的 SQL Server 2014 上测试了您给定的设置,一切正常。您的实际设置是否略有不同?
【解决方案2】:

试试这个:

SELECT DISTINCT
    p.ProductId,
    STUFF
    (
        (
            SELECT ',' + Name
            FROM models m
            WHERE m.ModelId IN (SELECT ModelId FROM products WHERE ProductId = p.ProductId)
            ORDER BY Name
            FOR XML PATH(''), type
        ).value('.', 'varchar(max)'), 1, 1, ''
    ) AS ModelNames
FROM
    products p

【讨论】:

  • 它仍然是一样的,因为我是 geeting 的 o/p
  • @Qwerty 我已经在 SSMS 中测试了我的代码,它给了我这些记录作为输出:(12345 vor,win,xia), (12346 win,xia)。我真的想不出你的配置出了什么问题。
【解决方案3】:

试试这个,这匹配你正在寻找的输出

DECLARE @ProductModel AS Table(ProductId  INT,ModelId Varchar(10))

INSERT INTO @ProductModel
VALUES(12345,'A3666'), 
(12345,'A3667'),      
(12345,'A8999'),
(12346,'A3666'),
(12346,'A3667')

DECLARE @Model AS Table(ModelId  Varchar(10),Name Varchar(10))

Insert into @Model Values('A3666','win'),('A3667','xia'),('A8999','vor')          


SELECT
    p2.ProductId,
    STUFF
    (
        (
            SELECT ',' + Name
            FROM @ProductModel p1
            INNER JOIN @Model m ON m.ModelId=p1.ModelId
            WHERE p1.ProductId=p2.ProductId           
            ORDER BY Name
            FOR XML PATH(''), type
        ).value('.', 'varchar(max)'), 1, 1, ''
    ) AS ModelNames
FROM
    @ProductModel p2
    GROUP BY p2.ProductId

【讨论】:

    【解决方案4】:

    请将此代码替换为您的内容。 我真的在猜这个答案。

    SELECT
        Distinct
        p.ProductId,
        coalesce(models + ', ', '')
    FROM
        products p
        --Other joins----
    

    【讨论】:

    • 没有用。它现在给出了每种产品的所有名称。
    • @qwerty 我已经编辑了答案
    猜你喜欢
    • 2014-03-03
    • 2012-09-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多