在SQL中的SubQuery中分配列的值

时间:2013-07-30 19:35:59

标签: sql sql-server subquery

我正在尝试在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

我不知道这是否可行。如果没有加入桌子,有谁知道怎么做?

2 个答案:

答案 0 :(得分:7)

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

SELECT 
  Producer = p.PRODUCER_NAME, 
  Products = STUFF((
    SELECT ',' + pr.PRODUCT_NAME 
      FROM dbo.PRODUCT AS pr
      WHERE pr.PRODUCER_ID = p.PRODUCER_ID 
      FOR XML PATH('')).value('.[1]','nvarchar(max)'),1,1,'')
FROM dbo.PRODUCER AS p;

答案 1 :(得分: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,以正确使用“Product&”等名称。 1' 。