每个itemid组合重复结果,每个itemid 6-7个图像

时间:2014-02-09 23:41:39

标签: sql sql-server

参考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是因为结果包含“$”而我需要将它们包装在“”中以便导入。

提前感谢我能得到的任何帮助。

1 个答案:

答案 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应该是1stuff()的第三个参数是长度,因此这将删除结果的前两个字符。但是,你只是预先挂起一个字符,所以这似乎是吃了第一个标题的第一个字符。

编辑:

“更长”版本的查询应如下所示。表别名有助于提高查询的可读性:

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;