是否有SQL query/function returns 一组行,当只有一行满足WHERE子句的要求?

Is there a SQL query/function that returns a grouping of rows when only one row meets requirements of the WHERE clause?

我有一个数据库 table (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'

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

使用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'
             );

您还可以使用 window 函数:

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';

您可以在一个查询中同时包含 WHERE 和 HAVING 子句。 WHERE 在分组之前过滤数据,然后 HAVING 过滤数据。尝试这样的事情...

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

对于您的情况,我认为您甚至不需要对数据进行分组。

使用 self-join

select i.*
from invoices i
inner join (select distinct invoice_nbr 
            from invoices
            where approval_date >= date '2020-04-01') i2 on i2.invoice_nbr = i.invoice_nbr