Sql 检索行ID,其中该ID共享的属性对于所有对应的行为空
我有一个正在使用的项目表,它有两列:Sql 检索行ID,其中该ID共享的属性对于所有对应的行为空,sql,oracle,Sql,Oracle,我有一个正在使用的项目表,它有两列:orderId和date 如果订单的任何项目的日期不为空,则该订单应被视为“已发货”。否则,它将被视为“正在处理” 我需要一个查询来获取所有“已发货”或所有“正在处理”的订单 发货很容易: 我可以轻松获得“已发货”订单: SELECT DISTINCT orderId FROM Orders WHERE date IS NOT NULL 对于相同的orderId,只要其中一行的date不为NULL,那么date是否为NULL并不重要 为了得到“处理”,到目
orderId
和date
如果订单的任何项目的日期不为空
,则该订单应被视为“已发货”。否则,它将被视为“正在处理”
我需要一个查询来获取所有“已发货”或所有“正在处理”的订单
发货很容易:
我可以轻松获得“已发货”订单:
SELECT DISTINCT orderId FROM Orders WHERE date IS NOT NULL
对于相同的orderId
,只要其中一行的date不为NULL,那么date是否为NULL并不重要
为了得到“处理”,到目前为止我已经
SELECT orderId FROM Orders GROUP BY orderId HAVING COALESCE(date, NULL) IS NULL
但这会散发出
ORA-00979:不是表达式的组
我有没有办法构造一个查询,返回所有的orderId
,其中所有对应的date
s都是NULL
?有两种方法可以做到这一点。这里有一个使用的选项不存在
:
select distinct orderId
from Orders o
where not exists (
select 1
from Orders o2
where o.orderId = o2.orderId
and o2.dt is not null)
下面是另一个条件聚合:
select orderId
from Orders o
group by orderId
having sum(case when dt is not null then 1 else 0 end) = 0
您可以在HAVING
子句中使用MAX
函数,如下所示:
SELECT orderId FROM Orders GROUP BY orderId HAVING max("DATE") is null
如果订单的最大日期为空,则其所有日期实际上都为空。这似乎会导致聚合函数中出现空列的警告。
Ok,然后您可以将最大(日期)为空替换为,例如,max(nvl(日期,'01/01/1970'))='01/01/1970'。它将保证max函数中没有空值。您可以将1970年1月1日替换为表中比以往更小的日期