2016-11-03 2 views
2

У меня есть запрос, как этотКак преобразовать условный внутренний запрос в LEFT JOIN в MYSQL?

SELECT * FROM CC 
INNER JOIN App (CC.id = App.id) 
WHERE CC.counter >1000 
AND 0 = IF(CC.key1 = App.key1, 
        (SELECT COUNT(*) 
         FROM Service 
         WHERE App.No = Service.No 
        ) 
        ), 
        (SELECT COUNT(*) 
         FROM Service 
         WHERE App.NoCo = Service.No 
         AND App.NoCo != '' 
        ) 
        ) 
       ) 

Как преобразовать внутренний кондиционер запрос LEFT JOIN в MYSQL?

Я пытаюсь преобразовать этот подзапрос присоединиться условие для повышения производительности

ответ

1

Попробуйте это:

SELECT * FROM CC 
INNER JOIN App (CC.id = App.id) 
LEFT JOIN(SELECT s.no,count(*) as cnt_1,sum(s.no <> '') as cnt_2 
      FROM Service s 
      GROUP BY s.no) t 
ON(0 = CASE WHEN CC.key1 = App.key1 THEN t.cnt_1 ELSE t.cnt_2 END) 
WHERE CC.counter >1000 
1

Я бы вместо этого использовать EXISTS:

SELECT * 
FROM CC INNER JOIN 
    App 
    ON CC.id = App.id 
WHERE CC.counter > 1000 AND 
     ((CC.key1 = App.key1 AND 
     NOT EXISTS (SELECT 1 
        FROM Service 
        WHERE App.No = Service.No 
        ) OR 
     (CC.key1 = App.key1 AND 
     NOT EXISTS (SELECT 1 
        FROM Service 
        WHERE App.NoCo = Service.No AND 
          App.NoCo <> '' 
        ) 
     ) 
     ); 

производительности, вы хотите индекс на Service(No) и CC(counter, id).

Вы должны быть осторожны с LEFT JOIN, потому что ваши условия имеют OR. Это может непреднамеренно умножить количество строк.

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