4

我正在尝试在 SQL Server 中执行以下操作:

SELECT 
    PRODUCER_NAME, PRODUCER_ID,
    (SELECT @X = @X + PRODUCT_NAME 
     FROM PRODUCT 
     WHERE PRODUCER_ID = PRODUCER.ID) 
FROM 
    PRODUCER

有两张桌子。Producer表是所有生产者的列表。Product表存储生产者生产的产品。@xvarchar可变的

基本上我想要一个所有产品的列表,由生产者以逗号分隔。

例如

Producer     Products
--------     --------------------------
P1           ProductA,ProductB,ProductC
P2           ProductD,ProductE

我不知道这种方式是否可行。有谁知道如何在不加入表格的情况下做到这一点?

4

2 回答 2

7

我没有办法让您将多个输出逗号分隔的列表分配给单个 varchar 变量,但也许您实际上并不需要它。尝试这个:

SELECT Producer = PRODUCER.PRODUCER_NAME, 
       Products = STUFF(
       (
         SELECT N',' + PRODUCT.PRODUCT_NAME 
           FROM dbo.PRODUCT
           WHERE PRODUCT.PRODUCER_ID = PRODUCER.ID 
         FOR XML PATH(''), 
         TYPE).value(N'./text()[1]', N'nvarchar(max)'),1,1,N'')
  FROM dbo.PRODUCER;

在大表上,这种相关子查询可能非常昂贵。在 SQL Server 2017+ 上,我们可以STRING_AGG()一次性使用:

SELECT Producer = PRODUCER.PRODUCER_NAME, 
       Products = STRING_AGG(PRODUCT.PRODUCT_NAME, N',')
FROM dbo.PRODUCT
INNER JOIN dbo.PRODUCER
  ON PRODUCT.PRODUCER_ID = PRODUCER.ID
GROUP BY PRODUCER.PRODUCER_NAME;
于 2013-07-30T19:38:11.680 回答
1

如果要连接名称,可以这样做:

select
    P.PRODUCER_NAME, P.PRODUCER_ID,
    stuff(
        (
            select ',' + T.PRODUCT_NAME
            from PRODUCT as T
            where T.PRODUCER_ID = P.PRODUCER_ID
            for xml path(''), type
        ).value('.', 'nvarchar(max)')
    , 1, 1, '') as PRODUCT_NAMES
from PRODUCER as P

两个注意事项:

  1. 始终对此类查询使用表别名。要了解原因 - 从查询中删除别名并从 PRODUCT 表中删除 PRODuCER_ID。
  2. 使用value方法而不是隐式转换为 nvarchar 以正确使用诸如“产品和 1”之类的名称。
于 2013-07-30T19:42:42.550 回答