sql - 当只有一行满足 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 的所有批准级别?
解决方案
使用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';
推荐阅读
- grails - 在 grails 2 中加载 jquery 库失败了?
- java - Thread::getId() 的用例?
- javascript - 如何在不调用它们的情况下传递承诺数组?
- docker - 如何获取基于rhel7的tomcat docker镜像?
- ms-word - MailMerge 字段中的多个条件
- regex - 我正在寻找使用 REGEXP_SUBSTR 从给定字符串集中提取子字符串
- html - 网络抓取 rvest 问题篮球运动员
- ssis - 无法使用 SSIS 包使用数据工厂将数据导入 Azure 数据仓库
- z3 - 你知道如何为每个 z3 Array 元素设置“弱”初始值吗?
- c++ - 如何以抽象函数类型制作线程池任务?