Sql server MS SQL Server中的组连接

Sql server MS SQL Server中的组连接,sql-server,sql-server-2008,cursor,concatenation,group-concat,Sql Server,Sql Server 2008,Cursor,Concatenation,Group Concat,我有两个表dbo.Supplier和dbo.L_ProductSupplier作为LPST,对于LPST表上的所有产品ID,我想将dbo.Supplier作为ST的供应商名称连接起来,它通过SupplierID字段链接到LPST。每个产品可以有多个供应商 e、 g.查询应采用以下方式: LPST.ProductID LPST.SupplierID ST.SupplierName 1 A CompanyA 1

我有两个表dbo.Supplier和dbo.L_ProductSupplier作为LPST,对于LPST表上的所有产品ID,我想将dbo.Supplier作为ST的供应商名称连接起来,它通过SupplierID字段链接到LPST。每个产品可以有多个供应商

e、 g.查询应采用以下方式:

LPST.ProductID  LPST.SupplierID ST.SupplierName
1                          A    CompanyA
1                          B    CompanyB
1                          C    CompanyC
2                          X    CompanyX
2                          Y    CompanyY
2                          Z    CompanyZ
并输出以下内容:

LPST.ProductID  SupplierName(s)
1               CompanyA / CompanyB /CompanyC
2               CompanyX / CompanyY / CompanyZ
我尝试了以下代码:

SELECT DISTINCT
LPST.ProductId,
STUFF((SELECT ',' + ST.SupplierName
FROM dbo.Supplier AS ST
WHERE LPST.SupplierId=ST.SupplierId
FOR XML PATH('')),1,1,'') AS SupplierNames 
FROM dbo.L_ProductSupplier AS LPST
GROUP BY LPST.ProductId
…但它给出了错误:列“dbo.L_ProductSupplier.SupplierId”在选择列表中无效,因为它不包含在聚合函数或GROUP BY子句中。有没有办法解决这个问题?如果我在之前删除了组,那么它会在LPST上报告每一行,而不进行连接

还有别的方法吗?我听说游标是一种选择,但我是SQL新手,对它们不熟悉;在这种情况下,有人有使用游标的经验吗?

如何

DECLARE @Supplier TABLE(
    SupplierId INT,
    SupplierName VARCHAR(50)
)

INSERT INTO @Supplier SELECT 1, 'A'
INSERT INTO @Supplier SELECT 2, 'B'

DECLARE @L_ProductSupplier TABLE(
    ProductId INT,
    SupplierId INT
)       

INSERT INTO @L_ProductSupplier SELECT 1, 1
INSERT INTO @L_ProductSupplier SELECT 1, 2


;WITH Vals AS (
        SELECT  LPST.ProductId,
                LPST.SupplierId,
                ST.SupplierName
        FROM    @L_ProductSupplier LPST LEFT JOIN
                @Supplier ST ON LPST.SupplierId = st.SupplierId
)
SELECT  LPST.ProductId,
        STUFF(
                (
                    SELECT ',' + ST.SupplierName
                    FROM Vals AS ST
                    WHERE LPST.ProductId=ST.ProductId
                    FOR XML PATH('')
                ),
                1,
                1,
                ''
            ) AS SupplierNames 
FROM    Vals AS LPST
GROUP BY    LPST.ProductId

有几种方法可以做到这一点——没有一种特别优雅。有关选项的完整列表,请参阅。根据KumarHarsh的回答,我可能会选择FOR-XML路径选项,因为它是最简洁的。谢谢James,FOR-XML路径是我走的路线,但我的代码没有达到预期的效果,有没有什么想法我哪里出错了?谢谢KumarHarsh。。。ABCXYZ只是为了演示,如果有200个公司名称,而我不知道它们都是什么,那该怎么办?@user3309874,如果你想根据productid连接供应商名称,这真的不重要。你必须提供真实的场景数据。200个公司名称不重要。告诉我哪一个示例数据无效谢谢astander,如果有200个公司名称,而我不知道哪些名称对应于哪些产品,这会起作用吗?
Declare @t table (ProductID int,  SupplierID varchar(1),SupplierName varchar(50))
insert into @t
select 1 ,                         'A'  ,  'CompanyA' union all
select 1                          , 'B'   , 'CompanyB' union all
select 1                         , 'C'   , 'CompanyC' union all
select 2                         , 'X'   , 'CompanyX' union all
select 2                         , 'Y'   , 'CompanyY' union all
select 2                         , 'Z'   , 'CompanyZ'

select distinct b.ProductID,stuff((select '/'+a.SupplierName from @t a where a.ProductID=b.ProductID FOR XML path('')),1,1,'')
from @t b