我经常编写查询,其中我转移数据并最终得到我想要折叠的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数据库,使用MIN
和MAX
的查询经常超时。我想知道是否有一种比我更有效的“折叠”NULL值的方法。有时我GROUP BY
另一个不是索引的字段,而上面显示的id
是主键。
答案 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
。我建议检查你的子查询,看看你是否可以避免那里的空值。