SQL 'Order By' 子句似乎有效,但 Returns 未排序的数据
SQL 'Order By' Clause Appears to Work, but Returns Unsorted Data
我在 SQL Server 2014 中有这个 table 值函数。重要的部分是最后的 'ORDER BY',它似乎什么也没做。如果我将其取出或删除 DESC,最终结果是相同的。为什么会这样?我通常希望它以这种方式使用时按最近 -> 最晚排序。
BEGIN
INSERT INTO @result (Id, Name, Description, TypeID, Date)
select b.ID, b.Name, b.Description, b.TypeID, max(Date) from BTable b
inner join ATTable at on b.atID = at.ID
inner join STATTable stat on at.ID= stat.atID
inner join CCTable cc on stat.stID= cc.stID
inner join STTAble st on cc.stID= st.ID
inner join TSTable ts on ts.cID = @cID and ts.bID = b.ID
where b.Active = 1 and at.Active = 1 and stat.Active = 1 and cc.Active = 1 and st.Type = 1 AND
cc.cID = @cId and (b.cID IS NULL OR b.cID = @cId) and b.aID = (Select c.aID from CTable c where c.ID = @cId)
GROUP BY b.ID, b.Name, b.Description, b.atID
ORDER BY Max(Date) DESC
RETURN
当使用这个函数时,我得到类似的东西:
Id |Name | Date
----------------------------------------------------------------------------
32 |Mary | NULL | 1 | 2015-06-04 00:00:00.000
68 |Joyce | NULL | 1 | 2015-02-25 00:00:00.000
1069 |James | NULL | 1 | 2014-03-31 00:00:00.000
1079 |Nwabudike | NULL | 1 | 2015-06-04 00:00:00.000
1143 |Hala | NULL | 1 | 2015-03-17 00:00:00.000
这显然不是按日期排序的。
为什么会这样,我怎样才能让它正确排序?
你不能。
结果集的顺序仅由最外层查询中的order by
决定。
所以,忘记函数中的order by
。然后将函数调用为:
select t.*
from dbo.tblfunc() t
order by t.date_received desc;
编辑:
老实说,如果 @result
是一个 "real" table,具有集群、身份、主键,并且您使用 order by
插入行,那么有你很有可能把它们恢复原状。对于较小的 tables 也是如此(因为 table 由聚簇索引扫描)。我不确定在并行环境中是否总是如此。
我在 SQL Server 2014 中有这个 table 值函数。重要的部分是最后的 'ORDER BY',它似乎什么也没做。如果我将其取出或删除 DESC,最终结果是相同的。为什么会这样?我通常希望它以这种方式使用时按最近 -> 最晚排序。
BEGIN
INSERT INTO @result (Id, Name, Description, TypeID, Date)
select b.ID, b.Name, b.Description, b.TypeID, max(Date) from BTable b
inner join ATTable at on b.atID = at.ID
inner join STATTable stat on at.ID= stat.atID
inner join CCTable cc on stat.stID= cc.stID
inner join STTAble st on cc.stID= st.ID
inner join TSTable ts on ts.cID = @cID and ts.bID = b.ID
where b.Active = 1 and at.Active = 1 and stat.Active = 1 and cc.Active = 1 and st.Type = 1 AND
cc.cID = @cId and (b.cID IS NULL OR b.cID = @cId) and b.aID = (Select c.aID from CTable c where c.ID = @cId)
GROUP BY b.ID, b.Name, b.Description, b.atID
ORDER BY Max(Date) DESC
RETURN
当使用这个函数时,我得到类似的东西:
Id |Name | Date
----------------------------------------------------------------------------
32 |Mary | NULL | 1 | 2015-06-04 00:00:00.000
68 |Joyce | NULL | 1 | 2015-02-25 00:00:00.000
1069 |James | NULL | 1 | 2014-03-31 00:00:00.000
1079 |Nwabudike | NULL | 1 | 2015-06-04 00:00:00.000
1143 |Hala | NULL | 1 | 2015-03-17 00:00:00.000
这显然不是按日期排序的。 为什么会这样,我怎样才能让它正确排序?
你不能。
结果集的顺序仅由最外层查询中的order by
决定。
所以,忘记函数中的order by
。然后将函数调用为:
select t.*
from dbo.tblfunc() t
order by t.date_received desc;
编辑:
老实说,如果 @result
是一个 "real" table,具有集群、身份、主键,并且您使用 order by
插入行,那么有你很有可能把它们恢复原状。对于较小的 tables 也是如此(因为 table 由聚簇索引扫描)。我不确定在并行环境中是否总是如此。