2017-02-06 10 views
2

У меня есть огромный запрос, как это:Альтернатива нескольким контатам в предложении WHERE?

SELECT 'Tipification', COUNT(*) TOTAL, to_char(INITDATE,'YYYY-MM-DD') 
FROM (
    SELECT (TYPE || ' \ ' || SUBTYPE || ' \ ' || PROBLEM) Triplet, INITDATE 
    FROM TABLE 
    WHERE USER IS NOT null 
     AND (INITDATE >= TO_DATE('2016-12-01 00:00', 'YYYY-MM-DD HH24:MI:SS')) 
     AND (INITDATE <= TO_DATE('2016-12-31 23:59', 'YYYY-MM-DD HH24:MI:SS')) 

     AND ((TYPE || ' \ ' || SUBTYPE || ' \ ' || PROBLEM) = 'aaa \ bbb \ ccc' 
      OR (TYPE || ' \ ' || SUBTYPE || ' \ ' || PROBLEM) = 'aaa \ bbb \ ddd' 
      OR (TYPE || ' \ ' || SUBTYPE || ' \ ' || PROBLEM) = 'xxx \ yyy \ zzz' 
      OR (TYPE || ' \ ' || SUBTYPE || ' \ ' || PROBLEM) = 'qqq \ www \ eee' 
      ... etc ... 
) 
GROUP BY to_char(INITDATE,'YYYY-MM-DD') 

Где перейти к более 300 строк сцеплений из этого: (TYPE || ' \ ' || SUBTYPE || ' \ ' || PROBLEM) = '... \ ... \ ...'.

Выполнение этого запроса, я получаю некоторые дампы ядра, поскольку это слишком дорого для выполнения БД.

Есть ли альтернативный способ выполнения такого запроса без того, что у БД заканчивается память?

+3

Почему бы не выполнить конкатенацию во встроенном представлении или CTE вместо повторения? Или используйте 'in' для сравнения отдельных столбцов вместо просмотра конкатенированных значений? (Кажется странным, чтобы получить ошибку памяти от этого, но предположительно вы исключили другие причины и имели небольшую цель памяти?) –

+1

Будет ли «и введите (список типов) или подтип в (список подтипов) или проблему в (список проблем) 'логически звучат? –

+1

'AND ((TYPE || '\' || SUBTYPE || '\' PROBLEM) IN ('aaa \ bbb \ ccc', 'aaa \ bbb \ ddd', 'xxx \ yyy \ zzz', ' qqq \ www \ eee ') '? – TheBakker

ответ

6

У Oracle есть хорошая функция in, которая позволяет размещать несколько столбцов.

select to_char(INITDATE,'YYYY-MM-DD'), count(*) 
from table 
where user is not null 
AND (INITDATE >= TO_DATE('2016-12-01 00:00', 'YYYY-MM-DD HH24:MI:SS')) 
AND (INITDATE <= TO_DATE('2016-12-31 23:59', 'YYYY-MM-DD HH24:MI:SS')) 
and (type, subtype, problem) in (
    ('aaa','bbb','ccc'), 
    ('aaa','bbb','ddd')) -- ... etc 
group by to_char(INITDATE,'YYYY-MM-DD') 
+0

Запрос, который занимал почти 3 секунды, уменьшался до менее чем 1 секунда. Большое вам спасибо :) – davidlimpo