在SQL中为子查询中的列赋值

在SQL中为子查询中的列赋值,sql,sql-server,subquery,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 有两张桌子生产者表是所有生产者的列表产品表存储生产商生产的产品@x是varchar变量 基本上我想要一个所有产品的列表,用逗号分隔,由生产者

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

SELECT 
    PRODUCER_NAME, PRODUCER_ID,
    (SELECT @X = @X + PRODUCT_NAME 
     FROM PRODUCT 
     WHERE PRODUCER_ID = PRODUCER.ID) 
FROM 
    PRODUCER
有两张桌子<代码>生产者表是所有生产者的列表<代码>产品表存储生产商生产的产品
@x
varchar
变量

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

比如说

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

我不知道这样做是否可行。有人知道如何在不连接表的情况下执行此操作吗?

我没有办法将多个以逗号分隔的输出列表分配给单个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;

如果要连接名称,可以执行以下操作:

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
注二:

  • 对于此类查询,始终使用表别名。要了解原因,请从查询中删除别名,并从产品表中删除生产者ID
  • 使用
    value
    方法,而不是隐式转换为nvarchar,以正确处理“Product&1”等名称

  • 如果您返回多行,您的varchar变量如何包含多个逗号分隔的列表?这就是我感到困惑的地方,所以我问了这样的问题……您能满足@Roman的要求并告诉我们PRODUCER中的键是PRODUCER_ID还是ID吗?我试着向他解释,这是完全不相关的,因为这些不是你真正的表名,但他一直对此耿耿于怀。Aaron我试过你的代码,效果很好,但获取结果需要时间。可能是因为索引吗?@Jignesh是的,可能是。是否有关于
    产品的索引。生产商ID
    ?我们这里说的是几排?“时间”有多长?不知道是谁否决了这个但是。。。哦,好吧。没有关系。我想是的revenge@swasheck是的,可能。当人们认为他们是因为质量以外的原因而放弃投票而取得了成就时,我们就知道真正的问题在哪里了。有一个关于组合主键生产者ID、产品ID的索引,有5个生产者,一个生产者ID平均有300个产品。取回花了3秒钟。感谢您提供的解决方案和注释!!!那些工作很棒!!!顺便提一下,在我的问题中,表名和列名都不是真实的。是的,我明白了,唯一的一点是警告人们使用别名。现在,我不能使用任何别名。不幸的是,表太大了,这比连接两个表要花更多的时间。你可以尝试使用游标解决方案