首页 > 解决方案 > 当只有一行满足 WHERE 子句的要求时,是否有返回一组行的 SQL 查询/函数?

问题描述

我有一个记录发票批准的数据库表(INVOICES):

    ORDER | INVOICE_NBR | APPROVAL_LEVEL | APPROVAL_DATE | APPROVER  
    123   |001          |1               |02-FEB-20      |John Smith
    123   |001          |2               |17-FEB-20      |Jane Smith
    123   |001          |3               |25-FEB-20      |Matt Jones
    123   |002          |1               |10-MAR-20      |John Smith
    123   |002          |2               |21-MAR-20      |Jane Smith
    123   |002          |3               |02-APR-20      |Matt Jones

如果在某个日期之后对发票进行了任何批准,我想检索该发票的所有批准。我试图对每张发票进行分组,然后使用 HAVING 子句......

Select ORDER, INVOICE_NBR, APPROVAL_LEVEL, APPROVER, APPROVAL_DATE
From INVOICES
Group By ORDER, INVOICE_NBR, APPROVAL_LEVEL, APPROVER, APPROVAL_DATE
Having APPROVAL_DATE >= '01-APR-20'

...但我仍然只返回上表的最后一行。如何根据 01-APR-20 之后的任何批准日期返回发票 002 的所有批准级别?

标签: sqloracle-sqldeveloper

解决方案


使用exists

select i.*
from invoices i
where exists (select 1
              from invoices i2
              where i2.invoice_nbr = i.invoice_nbr and
                    i2.approval_date >= date '2020-04-01'
             );

您还可以使用窗口函数:

select i.*
from (select i.*,
             max(approval_date) over (partition by invoice_nbr) as max_approval_date
      from invoices i
     ) i
where max_approval_date >= date '2020-04-01';

推荐阅读