Альтернатива выполнению подзапроса SQL Netezza несколько раз в случае, когда? - PullRequest
0 голосов
/ 25 января 2019
SELECT DISTINCT lr.id, 
       lr.dept,
       lr.name
       Case When lr.id IN (SELECT id FROM RESULTS WHERE PANEL_FLAG LIKE '%value1%') AND lr.id IN (SELECT id FROM RESULTS WHERE PANEL_FLAG LIKE '%value2%') Then 1
            Else 0
            End As both_panels,
       Case When lr.id IN (SELECT id FROM RESULTS WHERE PANEL_FLAG LIKE '%value1%') AND lr.id NOT IN (SELECT id FROM RESULTS WHERE PANEL_FLAG LIKE '%value2%') Then 1
            Else 0
            End As only_value1_panel,
  FROM RESULTS lr

Я упростил это, на самом деле мне действительно нужно гораздо больше операторов Case When и это кошмар производительности, потому что подзапрос выполняется каждый раз.Есть ли более эффективный способ сделать это?

Я пытался создать выражения Common Table и Temp Tables перед запросом, но способ, которым я это делал (замена операторов подзапроса на SELECT из CTE или таблицы Temp), кажется, не дает никакой производительностиразница, так как он все еще выполняет запрос каждый раз.

Ответы [ 2 ]

0 голосов
/ 28 января 2019

Если подзапросы для списков «in» имеют «константу», в которой я бы рассмотрел заполнение их в сценарии (запятые и все), затем вставьте их в файл «sql template» и запустите.Это будет работать очень быстро.Конечно, результирующие списки должны быть довольно небольшими (менее 60 КБ для всех списков), иначе оператор sql станет слишком большим.

0 голосов
/ 25 января 2019

Это обычно обрабатывается с помощью условного агрегирования.Я думаю, что это отражает вашу логику:

SELECT lr.id, lr.dept, lr.name,
       LEAST(MAX(Case When PANEL_FLAG LIKE '%value1%' THEN 1 ELSE 0 END),
             MAX(Case When PANEL_FLAG LIKE '%value2%' THEN 1 ELSE 0 END)
             ) As both_panels,
       LEAST(MAX(Case When PANEL_FLAG LIKE '%value1%' THEN 1 ELSE 0 END),
             MAX(Case When PANEL_FLAG LIKE '%value2%' THEN 0 ELSE 1 END)
             ) as only_value1_panel,
FROM RESULTS lr
GROUP BY lr.id, lr.dept, lr.name
...