2009-11-18 34 views
1

我经常编写查询,其中我将数据透视并最终以我想要折叠的NULL值结束。例如。像数据如下:在Oracle查询中折叠空值

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是主键。

回答

1

您需要检查语句的计划以了解为什么它会超时 - 除非您的分组可以使用索引以保证顺序获取行,否则查询必须在它可以返回之前检索所有源行任何结果。

另一种选择要考虑(这可能会或可能不会帮助):

SELECT DISTINCT 
     id, 
     MAX(time_in) OVER (PARTITION BY id), 
     MAX(time_out) OVER (PARTITION BY id) 
FROM (...) 
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; 
0

如果查询超时,子查询可能返回多行,甲骨文通常以排序,以group by。我建议检查你的子查询,看看你能否避免空值。