参考How to make a query with group_concat in sql server 我引用了上面的链接来解决重复项并在同一个字段中组合多个图像(很像那个链接中引用的图像),但不是每个项目获得6-7个图像,我得到每个项目中所有项目的所有图像。对于连接表,group by也不起作用。
select ItemId, Pictures = STUFF((
SELECT '|' + Title
FROM dbo.Pictures
WHERE ItemID = ItemID
FOR XML PATH(''), TYPE).value('.', 'NVARCHAR(MAX)'), 1, 2, '')
from dbo.Pictures
group by ItemID
分组使用这段代码,但我得到每个项目中所有项目的图像。
我需要使用它的代码是,
USE SixBit;
GO
SELECT dbo.Active.[Item ID], CONCAT (SixBit.dbo.Active.[Stock Number], ' ', Active.Stock) AS StockNumber,
CONCAT(SixBit.dbo.Active.Year, ' ', SixBit.dbo.Active.Model, ' / Stock Number - ', Active.[Stock Number], ' ', Active.Stock, ' / ', Active.Title, ' Interchange Part Number / ', Active.[Interchange Part Number], '/ ITEM CONDITION ', Active.[eBay Condition Description], Active.[Conditions and Options]
) AS Descrition, CONCAT(Active.Year, ' ', Active.Model) AS Category, Active.Title AS Name, CONCAT(SixBit.dbo.Active.Year, ' ', SixBit.dbo.Active.Model, ' / Stock Number - ', Active.[Stock Number], ' ', Active.Stock, ' / ', Active.Title,' Interchange Part Number / ', Active.[Interchange Part Number], '/ ITEM CONDITION ', Active.[eBay Condition Description], Active.[Conditions and Options]
) AS DescritionLong, Active.[Weight Major], Active.[Dimension Length], Active.[Dimension Width], Active.[Dimension Depth], Active.[Qty On Hand], Active.[Fixed Price], Active.SKU, Active.Model AS Manufacture, dbo.Listings.StartDate,
Pictures = STUFF((
SELECT '|' + CONCAT ('"', dbo.Pictures.Title, '"')
FROM dbo.Pictures
WHERE ItemID = ItemID
FOR XML PATH(''), TYPE).value('.', 'NVARCHAR(MAX)'), 1, 1, '')
FROM Listings INNER JOIN
Active ON Listings.ListingID = Active.[Item ID] INNER JOIN
Pictures ON Active.[Item ID] = Pictures.ItemID
where dbo.Active.[Item ID] <= 10
group by不能使用此代码,如上所述,所有图像都在每个项目中,因此所有项目都包含所有图像。 p.s,我在STUFF中使用的concat是因为结果包含“$”而我需要将它们包装在“”中以便导入。
提前感谢我能得到的任何帮助。
答案 0 :(得分:1)
您需要正确关联子查询。表达式:
WHERE ItemID = ItemID
始终在内部查询中评估为true
(除非ItemId
可以是NULL
)。您需要表别名来区分内表和外表。这是结果查询:
select p.ItemId, Pictures = STUFF((
SELECT '|' + p2.Title
FROM dbo.Pictures p2
WHERE p.ItemID = p2.ItemID
FOR XML PATH(''), TYPE).value('.', 'NVARCHAR(MAX)'), 1, 2, '')
from dbo.Pictures p
group by p.ItemID;
另外,我认为2
应该是1
。 stuff()
的第三个参数是长度,因此这将删除结果的前两个字符。但是,你只是预先挂起一个字符,所以这似乎是吃了第一个标题的第一个字符。
编辑:
“更长”版本的查询应如下所示。表别名有助于提高查询的可读性:
SELECT a.[Item ID], CONCAT(a.[Stock Number], ' ', a.Stock) AS StockNumber,
CONCAT(a.Year, ' ', a.Model, ' / Stock Number - ', a.[Stock Number], ' ',
a.Stock, ' / ', a.Title, ' Interchange Part Number / ',
a.[Interchange Part Number], '/ ITEM CONDITION ',
a.[eBay Condition Description], a.[Conditions and Options]
) AS Description,
CONCAT(a.Year, ' ', a.Model) AS Category, a.Title AS Name,
CONCAT(a.Year, ' ', a.Model, ' / Stock Number - ', a.[Stock Number], ' ',
a.Stock, ' / ', a.Title,' Interchange Part Number / ',
a.[Interchange Part Number], '/ ITEM CONDITION ',
a.[eBay Condition Description], a.[Conditions and Options]
) AS DescriptionLong,
a.[Weight Major], a.[Dimension Length], a.[Dimension Width], a.[Dimension Depth],
a.[Qty On Hand], a.[Fixed Price], a.SKU, a.Model AS Manufacture,
l.StartDate,
Pictures = STUFF((SELECT '|' + CONCAT ('"', p2.Title, '"')
FROM dbo.Pictures p2
WHERE p2.ItemID = a.[Item ID]
FOR XML PATH(''), TYPE).value('.', 'NVARCHAR(MAX)'
), 1, 1, '')
FROM Listings l INNER JOIN
Active a
ON l.ListingID = a.[Item ID]
where a.[Item ID] <= 10;