在T-sql中使用FOR XML的Order By问题(ORDER BY子句在视图,内联函数,派生表中无效)

时间:2015-05-06 05:08:02

标签: sql sql-server xml sql-order-by

select a.Hall, a.Title, 
  STUFF((SELECT ', ' + '[' + CONVERT(varchar(2),DATEPART(Hour, b.StartFilm))  
  + ':' + CONVERT(varchar(2),DATEPART(Minute, b.StartFilm)) 
  + ' ' + CONVERT(varchar(2),DATEPART(Hour, b.EndTime))  
  + ':' + CONVERT(varchar(2),DATEPART(Minute, b.EndTime)) 
  + ']' 
FROM (select c.Name as Hall, b.Title, 
    Convert(time,a.StartFilmTime) as StartFilm,  
    Convert(time,a.EndFilmTime) as EndTime
  from FilmSchedule a 
    left join Film b on a.FilmId = b.Id 
    left join Room c on a.RoomId = c.Id 
  where a.ApproveStatus = 1 and a.Status = 1 
        and CONVERT(date, a.StartFilmTime) =  '05-06-2015'
) b 
Where a.Hall = b.Hall and a.Title = b.Title 
FOR XML PATH('')),1,1,'') As ShowTime  
from (select c.Name as Hall, b.Title, 
  Convert(time,a.StartFilmTime) as StartFilm,  
  Convert(time,a.EndFilmTime) as EndTime
  from FilmSchedule a 
  left join Film b on a.FilmId = b.Id 
  left join Room c on a.RoomId = c.Id 
  where a.ApproveStatus = 1 and a.Status = 1 
     and CONVERT(date, a.StartFilmTime) =  '05-06-2015'
  Order by a.StartFilmTime
) a 
group by a.Hall, a.Title

我收到错误:

  

ORDER BY子句在视图,内联函数,派生表,子查询和公用表表达式中无效,除非还指定了TOP或FOR XML。

请帮忙! (我使用过FOR XML?)

1 个答案:

答案 0 :(得分:2)

虽然您的查询确实使用了FOR XML(对于GROUP_CONCAT workaround),但是您在使用FOR XML的派生表外部应用订单,因此会出错。

鉴于您未在最终选择中直接包含开始日期(尽管您将其作为STUFF ShowTime列的一部分进行撰写),但最终ORDER BY StartFilm中也不能GROUP BY 1}}或者,因为该列需要包含在GROUP BY中或作为聚合列。

你可以做的是将ORDER BY移动到STUFF然后按派生列ShowTime排序(因为你的查询只运行一天,而StartFilmTime是{的第一部分{1}}撰写专栏)。

同时,我会用CTE干掉派生表上的重复:

STUFFED