2013-11-15 7 views
1

Как я могу переписать этот код SQL? Я бы хотел избежать повторного выполнения дела для каждой записи.Как я могу реорганизовать этот запрос

SELECT chcr.chsid, 
CASE 
WHEN EXISTS 
    (SELECT 1 
    FROM hdr_run chre, 
    clmerr ce 
    WHERE chre.chsid  = chcr.chsid 
    AND chre.run_nmbr  < chcr.last_run_nmbr 
    AND chre.clm_error_sid = ce.clm_error_sid 
    GROUP BY chre.chsid 
    HAVING COUNT(chre.clm_error_sid) > 0 
) 
THEN 'Appended' 
ELSE 'Never Appended' 
END Run_Detail 
FROM 
clm_res chcr, 
clm_der chde 
WHERE chde.chsid   = chcr.chsid 
+0

Ваше заявление недействительно. У вас есть 'AND', но нет' WHERE'. Я изменил инструкцию на 'WHERE' и удалил' AND'. Если это не то, что вы на самом деле имеете, отредактируйте свой вопрос, чтобы исправить утверждение. –

ответ

0

Посмотрите на этот запрос, пожалуйста:

SELECT 
    chcr.chsid, 
    CASE 
     WHEN ce.clm_error_sid IS NOT NULL AND COUNT(chre.clm_error_sid, 0) > 0 
      THEN 'Appended' 
      ELSE 'Never Appended' 
    END Run_Detail 
FROM 
    clm_res chcr 
     JOIN clm_der chde ON chde.chsid = chcr.chsid 
     LEFT JOIN hdr_run chre ON chre.chsid = chcr.chsid AND chre.run_nmbr < chcr.last_run_nmbr 
     LEFT JOIN clmerr ce ON chre.clm_error_sid = ce.clm_error_sid 
GROUP BY chcr.chsid 

Если есть более чем один clm_der для каждого clm_res на основе их chsid, мы должны были бы перепроверить, что COUNT не считая Дополнительно от clm_der.

0

У меня нет данных, чтобы проверить это на так все, что я могу пойти на это SQL вы предоставили, но из краткого взгляда не кажется, что заявления GROUP BY и HAVING COUNT() > 0 необходимы как комбинация условия INNER JOIN в подзапрос и использование EXISTS во внешнем запросе делает то же самое.

ли это имеет точно такую ​​же функциональность:

SELECT chcr.chsid, 
     CASE 
     WHEN EXISTS 
     (SELECT 1 
      FROM hdr_run chre 
       INNER JOIN 
       clmerr ce 
       ON (chre.clm_error_sid = ce.clm_error_sid) 
      WHERE chre.chsid = chcr.chsid 
      AND chre.run_nmbr < chcr.last_run_nmbr 
     ) 
     THEN 'Appended' 
     ELSE 'Never Appended' 
     END Run_Detail 
FROM clm_res chcr 
     INNER JOIN 
     clm_der chde 
     ON (chde.chsid = chcr.chsid); 

SQLFIDDLE

Кроме того, повторное выполнение в CASE утверждения не плохо, поскольку оптимизатор не должен дублировать выполнения подзапроса.

Смежные вопросы