【问题标题】:Adding order by for XML throws error为 XML 添加 order by 会引发错误
【发布时间】:2017-05-31 07:15:10
【问题描述】:

这是我的实际查询

SELECT 
    aces.ProductID,'<p>' +  
    Replace(STUFF((SELECT DISTINCT ', ' + CAST(A.year AS VARCHAR(4)) + ' ' + A.make + ' ' + A.model + ' ' + A.enginebase_new 
                   FROM ACES_Data A 
                   WHERE A.ProductID = aces.ProductID 
                   FOR XML PATH('')), 1, 1, ''), ',', '<br>')
           + '</p><p>' + i.[Subline Code] + '<br>' + i.[Subline Name] + '</p>' AS FullDescription 
FROM
    ACES_Data aces 
LEFT OUTER JOIN
    InventoryPricing i ON aces.part_number = i.PART  
WHERE 
    aces.ProductID IS NOT NULL
    AND aces.MakeModelMappingID IS NOT NULL
GROUP BY 
    aces.ProductID, i.[Part Description], i.[Subline Code], i.[Subline Name]

现在在 XML 引发错误之前添加 order by。

请看下面更新的查询

 SELECT 
    aces.ProductID,'<p>' +  
    Replace(
            STUFF
                (
                    (
                        SELECT 
                            distinct ', ' + Cast(A.year as varchar(4)) + ' ' + A.make +' ' + A.model + ' ' + A.enginebase_new 
                        FROM 
                            ACES_Data A 
                        Where 
                            A.ProductID=aces.ProductID 
                        order by A.make,A.year asc
                        FOR XML PATH('') 
                    ),1,1,'')
                    ,',',
                    '<br>'
                )
    + '</p><p>' + i.[Subline Code] + '<br>'+ i.[Subline Name] + '</p>' As FullDescription 
from ACES_Data aces 
Left outer join InventoryPricing i 
on aces.part_number = i.PART  
where aces.ProductID is not null 
and aces.MakeModelMappingID is not null  
Group By aces.ProductID,i.[Part Description],i.[Subline Code],i.[Subline Name]

关于插入

Where A.ProductID=aces.ProductID **order by A.make,A.year asc**  FOR XML PATH('') 

它给了我错误

如果指定了 SELECT DISTINCT,则 ORDER BY 项目必须出现在选择列表中。

【问题讨论】:

  • 您没有使用 MySQL、Oracle、和 SQL Server。请仅添加您实际使用的 RDMS 的标签。
  • 您还应该格式化您的查询,因为这里的大多数用户对阅读这样的长字符串不感兴趣
  • 我现在已经格式化了您的查询,但请您以后始终在此平台上格式化您的查询。

标签: sql xml sql-server-2008 tsql


【解决方案1】:

由于enginebase_new 和model 不是Order by 的一部分,因此您不能在Select 中使用DISTINCT。

使用Group by 而不是DISTINCT 删除重复项

SELECT ', ' + Cast(A.year AS VARCHAR(4)) + ' ' + A.make
       + ' ' + A.model + ' ' + A.enginebase_new
FROM   ACES_Data A
WHERE  A.ProductID = aces.ProductID
GROUP  BY A.year,
          A.make,
          A.model,
          A.enginebase_new
ORDER  BY A.make,
          A.year ASC
FOR XML PATH('') 

【讨论】:

  • 显示错误为列 'ACES_Data.year' 在选择列表中无效,因为它既不包含在聚合函数或 GROUP BY 子句中。
  • 关于删除 +' '+ 表单查询时我面临的问题是“列 'ACES_Data.make' 在选择列表中无效,因为它既不包含在聚合函数中,也不包含在 GROUP BY 子句中。”
  • 我面临的第二个问题呢?“列 'ACES_Data.make' 在选择列表中无效,因为它既不包含在聚合函数中,也不包含在 GROUP BY 子句中。”
  • @Xtremcool - 单独运行此查询并先检查......不要在您的查询中替换
  • 实际上问题只针对一年而不是针对制造
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2015-12-01
  • 2019-05-13
  • 2017-07-07
  • 1970-01-01
  • 1970-01-01
  • 2021-12-22
  • 2013-05-23
相关资源
最近更新 更多