Sql server MS SQL Server中的组连接
我有两个表dbo.Supplier和dbo.L_ProductSupplier作为LPST,对于LPST表上的所有产品ID,我想将dbo.Supplier作为ST的供应商名称连接起来,它通过SupplierID字段链接到LPST。每个产品可以有多个供应商 e、 g.查询应采用以下方式: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
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