首页 文章

Oracle - 在union all子查询中排序

提问于
浏览
1

我有一个查询,其中单个选择从表中提取最新结果 . 所以我有id desc的选择顺序,所以最新的是top,然后使用rownum来显示最高的数字 . 每个选择都是我想要最新结果的不同地方 .

但是,我遇到的问题是order by不能在union all的select语句中使用 .

select 'MUHC' as org, 
       aa, 
       messagetime 
  from buffer_messages 
 where aa = 'place1' 
   and rownum = 1 
 order by id desc
union all 
select 'MUHC' as org, 
       aa, 
       messagetime 
  from buffer_messages 
 where aa = 'place2' 
   and rownum = 1
 order by id desc;

每个选择必须有订单,否则它不会拉最新版本 . 完全做到这一点有什么不同的想法,或者用联盟做到这一点的方法可以得到我想要的结果吗?

3 回答

  • 3

    通过在 order by 子句之前放置 where .. and rownum = 1 条件,您将不会产生所需的结果,因为结果集将在 where 子句应用后排序,因此在结果集中只排序一行,该行可以是查询返回的任何第一行 .

    此外,在 union all 子句之前放置 order by 子句在语义上是不正确的 - 您将需要一个包装器select语句 .

    您可以按如下方式重写sql语句:

    select *
      from ( select 'MUHC' as org
                   , aa 
                   , messagetime 
                   , row_number() over(partition by aa
                                           order by id desc) as rn
               from buffer_messages 
            ) s
    where s.rn = 1
    

    这是第二种方法:

    select max('MUHC')                                         as org
         , max(aa)                                             as aa
         , max(messagetime) keep (dense_rank last order by id) as messagetime 
     from buffer_messages
    group by aa
    
  • 0

    试试这个

    select 'MUHC' as org, 
       aa, 
       messagetime 
    from buffer_messages bm
    where aa = 'place1' 
    and id= (Select max(id) from buffer_messages where aa = 'place1'  )
    union all 
    select 'MUHC' as org, 
       aa, 
       messagetime 
    from buffer_messages 
    where aa = 'place2' 
    and id= (Select max(id) from buffer_messages where aa = 'place2'  )
    
  • 0

    为了在所有子查询中使用ORDER BY和UNION ALL,我们可以使用下面的查询 .

    SELECT * FROM (
      SELECT 'MUHC' AS org, aa, messagetime
      FROM buffer_messages 
      WHERE aa = 'place1' AND rownum = 1
      ORDER BY id desc
    )
    UNION ALL
    SELECT * FROM (
      SELECT 'MUHC' AS org, aa, messagetime
      FROM buffer_messages 
      WHERE aa = 'place2' AND rownum = 1
      ORDER BY id desc
    )
    

相关问题