Union All之后的排序


Sorting After Union All

为了测试这些查询,我在Microsoft Access中的SQL查询向导中运行它们。我试图修改现有的php文件,以便在顶部显示高优先级状态警报(O和P),然后由opslogid按降序排序。在没有更多的O和P状态警报之后,我想显示剩余的状态警报(A、I、R),按opslogid降序排序。以下是样例数据和所需的输出:

tblOpslog
opslogid = 9999, 9998, etc.
status = R, O, I, A, P
opslogid                               status
9999                                       P
9996                                       P
9994                                       O
9991                                       O
9998                                       I
9997                                       I
9980                                       A
9979                                       A
9978                                       A
9930                                       R
9928                                       R

我的同事建议我使用联合所有命令,这导致我想出了这个:

注意:"删除的地方和NOVIEW必须保留在查询中,这对数据库的输出是至关重要的"。而且我不能对数据库本身做任何更改。

select * from (SELECT * FROM tblOpslog
Where Deleted = No AND Noview = No AND status in ('O','P'))
union all
select * from (Select * FROM tblOpslog Where Deleted = No AND Noview = No AND status in ('I','R', 'A'))
Order by status, opslogid DESC;

它的输出是:

opslogid                               status
9980                                       A
9979                                       A
9978                                       A
9998                                       I
9997                                       I
9994                                       O
9991                                       O
9999                                       P
9996                                       P
9930                                       R
9928                                       R

我真的很感激,如果有人能有人建议什么修复/添加到代码显示所需的输出?谢谢你

由于status的排序不是按字母顺序排列的,因此必须使用CASE表达式来控制排序:

SELECT *
FROM tblOpsLog
WHERE Deleted = No AND Noview = No AND status IN ('A', 'I', 'R', 'O', 'P')
ORDER BY CASE WHEN status IN ('O', 'P') then 1
              ELSE 2
         END, opslogid DESC

你所尝试的将在mysql中工作,因为它分别订购UNION的每个分支。但其他SQL引擎将ORDER BY应用于整个UNION

SQLFIDDLE