在Oracle查询中折叠NULL值

时间:2009-11-18 20:12:20

标签: oracle plsql group-by aggregate

我经常编写查询,其中我转移数据并最终得到我想要折叠的NULL值。例如。数据如下:

id  time_in     time_out
1               2009-11-01
1   2009-10-30
2   2008-12-15
2               2009-02-03
然后我会像这样做一个外部查询:

SELECT id,
       MIN(time_in) AS time_in,
       MIN(time_out) AS time_out
FROM (...query above...)
GROUP BY id

这将产生如下数据:

id  time_in     time_out
1   2009-10-30  2009-11-01
2   2008-12-15  2009-02-03

问题是我使用有限的接口访问Oracle数据库,使用MINMAX的查询经常超时。我想知道是否有一种比我更有效的“折叠”NULL值的方法。有时我GROUP BY另一个不是索引的字段,而上面显示的id是主键。

3 个答案:

答案 0 :(得分:1)

SELECT a.id,
       a.time_in,
       b.time_out
FROM 
(
  SELECT id, time_out
  FROM (...query above...)
  WHERE time_in is not null
) a,
(
  SELECT id, time_out
  FROM (...query above...)
  WHERE time_out is not null
) b
WHERE a.id = b.id;

答案 1 :(得分:1)

您需要检查语句的计划以了解它的超时原因 - 除非您的分组可以使用索引以保证顺序获取行,查询必须先检索所有源行,然后才能返回任何行结果

另一个需要考虑的选择(可能有帮助也可能没有帮助):

SELECT DISTINCT
       id,
       MAX(time_in) OVER (PARTITION BY id),
       MAX(time_out) OVER (PARTITION BY id)
FROM (...)

答案 2 :(得分:0)

如果查询超时,子查询可能会返回许多行,Oracle通常必须对这些行进行排序才能group by。我建议检查你的子查询,看看你是否可以避免那里的空值。