свертывание значений NULL в запросе Oracle - PullRequest
1 голос
/ 18 ноября 2009

Я часто пишу запросы, в которых я поворачиваю данные и в результате получаю значения 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, показанное выше, является первичным ключом.

Ответы [ 3 ]

1 голос
/ 19 ноября 2009

Вам нужно будет проверить план вашего оператора, чтобы понять, почему он истекает - если ваша группировка не может использовать индекс для получения строк в гарантированном порядке, запрос должен получить все исходные строки, прежде чем он сможет вернуть любой результат.

Другой вариант для рассмотрения (который может или не может помочь):

SELECT DISTINCT
       id,
       MAX(time_in) OVER (PARTITION BY id),
       MAX(time_out) OVER (PARTITION BY id)
FROM (...)
1 голос
/ 19 ноября 2009
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 голосов
/ 19 ноября 2009

Если ваш запрос истекает, подзапрос, вероятно, возвращает много строк, которые Oracle обычно должны отсортировать для group by. Я предлагаю проверить ваш подзапрос, чтобы увидеть, можно ли там избежать нулей.

...