我有这个问题:
(SELECT * FROM items WHERE duration = 5 ORDER BY date DESC)
UNION
(SELECT * FROM items WHERE duration = 10)
问题是" ORDER BY"在第一个查询中不起作用。
答案 0 :(得分:0)
试试这个:
select * from (
SELECT * FROM items WHERE duration = 5
UNION
SELECT * FROM items WHERE duration = 10
) odrer by date DESC
答案 1 :(得分:0)
当您在每个select语句中不允许使用 UNION 或 UNION ALL 时。您必须在外部选择语句中应用 order by。
答案 2 :(得分:0)
首先按持续时间排序UNION
结果,然后按日期排序。
select *
from
(
SELECT * FROM items WHERE duration = 5
UNION
SELECT * FROM items WHERE duration = 10
)
order by duration, date DESC
但是,不需要UNION
(请参阅e4c5&#39}。
答案 3 :(得分:0)
如果我从评论中了解你,你想要这样的东西吗?
SELECT s.* FROM (
SELECT i.*,1 as ord_col FROM items i WHERE duration = 5
UNION
SELECT it.*,2 FROM items it WHERE duration = 10) s
ORDER BY CASE WHEN s.ord_col = 5 THEN s.date
ELSE '1000-01-01'
END DESC
虽然这个查询效率很低,但你可以选择一个:
SELECT i.* FROM items i WHERE i.duration IN(5,10)
ORDER BY CASE WHEN s.ord_col = 5 THEN s.date
ELSE '1000-01-01'
END DESC
如果它不是动态的,5
将在10
之前订购并且这些是常量值,您只需将duration
列添加到查询ORDER BY duration,date
即可这也将命令第二个查询为日期,就在第一个查询之后。
答案 4 :(得分:0)
我认为你甚至根本不需要UNION,你可以这样重构你的查询:
select *
from v$sql v Where v.PARSING_SCHEMA_NAME = '<schemaname>'
And module like 'TOAD%' and SUBSTR (V.LAST_LOAD_TIME, 1, 10) = '2016-08-10'
Order by V.LAST_LOAD_TIME desc
此查询将根据您的持续时间排序(具有5的那些将首先出现,10秒),然后作为二阶选项,它将按日期降序排列持续时间= 5的持续时间。
当然,这可能更优雅,但符合OP A / C并完成工作。