联合内外的排序结果
Order results inside and outside of union
我遇到了我所说的复杂 sql 查询,我需要对其实施更好的排序。我会给你一个更简单的版本,希望解决方案适用于原始版本。
假设我有两个 table 正在申请 UNION
。我想为每个 table 排序结果,然后是结果 table 本身。
假设我有这些 tables:
文件夹:
Name CreateDate
------------------
Music 2015-11-12
Videos 2012-11-12
文件:
Name CreateDate
------------------
file1 2014-11-12
file2 2013-11-12
用户可以按名称或创建日期对它们进行排序,但在结果中,文件夹始终必须首先出现。
我会这样写:
Select *
From (
Select Name, CreateDate, 1 as tableOrder
From Folders
Order by
CASE WHEN @NameOrder = 1 THEN Name END ASC,
CASE WHEN @DateOrder = 1 THEN CreateDate END ASC
UNION
Select Name, CreateDate, 2 as tableOrder
From Files
Order by
CASE WHEN @NameOrder = 1 THEN Name END ASC,
CASE WHEN @DateOrder = 1 THEN CreateDate END ASC
)
Order by tableOrder
但我知道我只能在union 之后使用order by。我怎样才能做到这一点?
在导出的 table 中执行 UNION
。 Order it's result, put tableOrder first 在 ORDER BY
:
select * from
(
Select Name, CreateDate, 1 as tableOrder
From Folders
UNION
Select Name, CreateDate, 2 as tableOrder
From Files
) dt
Order by tableOrder,
CASE WHEN @NameOrder = 1 THEN Name END ASC,
CASE WHEN @DateOrder = 1 THEN CreateDate END ASC
您的查询有多个问题。首先,查询的顺序由最外层查询中的 ORDER BY
仅 确定。其次,您正在使用 UNION
,这会产生额外的开销来删除重复项。
要解决这些问题:
Select Name, CreateDate, which
From ((Select Name, CreateDate, 1 as tableOrder
From Folders
) UNION ALL
(Select Name, CreateDate, 2 as tableOrder
From Files
)
) ff
Order by tableOrder,
(CASE WHEN @NameOrder = 1 THEN Name END) ASC,
(CASE WHEN @DateOrder = 1 THEN CreateDate END) ASC ;
我遇到了我所说的复杂 sql 查询,我需要对其实施更好的排序。我会给你一个更简单的版本,希望解决方案适用于原始版本。
假设我有两个 table 正在申请 UNION
。我想为每个 table 排序结果,然后是结果 table 本身。
假设我有这些 tables:
文件夹:
Name CreateDate
------------------
Music 2015-11-12
Videos 2012-11-12
文件:
Name CreateDate
------------------
file1 2014-11-12
file2 2013-11-12
用户可以按名称或创建日期对它们进行排序,但在结果中,文件夹始终必须首先出现。
我会这样写:
Select *
From (
Select Name, CreateDate, 1 as tableOrder
From Folders
Order by
CASE WHEN @NameOrder = 1 THEN Name END ASC,
CASE WHEN @DateOrder = 1 THEN CreateDate END ASC
UNION
Select Name, CreateDate, 2 as tableOrder
From Files
Order by
CASE WHEN @NameOrder = 1 THEN Name END ASC,
CASE WHEN @DateOrder = 1 THEN CreateDate END ASC
)
Order by tableOrder
但我知道我只能在union 之后使用order by。我怎样才能做到这一点?
在导出的 table 中执行 UNION
。 Order it's result, put tableOrder first 在 ORDER BY
:
select * from
(
Select Name, CreateDate, 1 as tableOrder
From Folders
UNION
Select Name, CreateDate, 2 as tableOrder
From Files
) dt
Order by tableOrder,
CASE WHEN @NameOrder = 1 THEN Name END ASC,
CASE WHEN @DateOrder = 1 THEN CreateDate END ASC
您的查询有多个问题。首先,查询的顺序由最外层查询中的 ORDER BY
仅 确定。其次,您正在使用 UNION
,这会产生额外的开销来删除重复项。
要解决这些问题:
Select Name, CreateDate, which
From ((Select Name, CreateDate, 1 as tableOrder
From Folders
) UNION ALL
(Select Name, CreateDate, 2 as tableOrder
From Files
)
) ff
Order by tableOrder,
(CASE WHEN @NameOrder = 1 THEN Name END) ASC,
(CASE WHEN @DateOrder = 1 THEN CreateDate END) ASC ;