联合内外的排序结果

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   ;