2

查看以下查询:

SELECT *
FROM ENI_FLUSSI_HUB c1
WHERE flh_tipo_processo_cod IN ('VA', 'NUOVA_ATT_ENI')
AND rownum < 10

它只是提取了一些 VA。我需要提取一些 VA 和一些 NUOVA_ATT_ENI。

最优雅的方法是什么?

4

2 回答 2

2

你可以这样做:

SELECT *
FROM ENI_FLUSSI_HUB c1
WHERE flh_tipo_processo_cod = 'VA'
AND rownum < 5

UNION 

SELECT *
FROM ENI_FLUSSI_HUB c1
WHERE flh_tipo_processo_cod = 'NUOVA_ATT_ENI'
AND rownum < 5

是否没有任何重复值,您可以使用它UNION ALL来更快地执行:

SELECT *
FROM ENI_FLUSSI_HUB c1
WHERE flh_tipo_processo_cod = 'VA'
AND rownum < 5

UNION ALL

SELECT *
FROM ENI_FLUSSI_HUB c1
WHERE flh_tipo_processo_cod = 'NUOVA_ATT_ENI'
AND rownum < 5

正如@DavidAldridge 所说,您始终可以使用 aview进行此选择。

于 2012-05-18T09:45:42.617 回答
1

这是一个很好的过度设计的解决方案:

with
  va as (
    select rowid ri,
           t.*
    from   eni_flussi_hub t
    where  flh_tipo_processo_cod = 'VA'
    and    rownum <= 1),
  nuova_att_eni as (
    select rowid ri,
           t
    from   eni_flussi_hub t
    where  flh_tipo_processo_cod = 'NUOVA_ATT_ENI'
    and    rownum <=1),
  the_rest as (
    select *
    from   eni_flussi_hub c1
    where  flh_tipo_processo_cod in ('VA','NUOVA_ATT_ENI')
    and    rowid not in (
             select ri
             from   va
             union all
             select ri
             from nuova_att_eni)
    and rownum <=9)
select *
from  (
      select * from va
      union all
      select * from nuova_att_eni
      union all
      select * from the_rest
      )
where rownum <= 10
/

认为它的作用是为 flh_tipe_processo_cod 的两个值中的每一个返回至少一行,然后“让大自然顺其自然”。

您必须在主查询中编辑 * 以避免尝试包含前两个子查询因式分解子句中的 rowid。

这是另一个,我认为尝试将每个恢复五个,但如果两个子查询因式分解子句中的任何一个可用的总数少于五个,则将“补足”所需的总数:

with
  va as (
    select rownum rn,
           t.*
    from   eni_flussi_hub t
    where  flh_tipo_processo_cod = 'VA'
    and    rownum <= 10),
  nuova_att_eni as (
    select rownum rn,
           t
    from   eni_flussi_hub t
    where  flh_tipo_processo_cod = 'NUOVA_ATT_ENI'
    and    rownum <=10)
select *
from  (
      select *
      from   (select * from va
              union all
              select * from nuova_att_eni)
      order by rn asc
      )
where rownum <= 10
/

享受!

于 2012-05-18T10:05:27.180 回答