2016-11-03 1 views
2

나는이MYSQL에서 조건부 내부 쿼리를 LEFT JOIN으로 변환하는 방법은 무엇입니까?

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 != '' 
        ) 
        ) 
       ) 

같은 쿼리를 어떻게 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)에 대한 색인을 원합니다.

조건이 OR이므로 LEFT JOIN과 조심해야합니다. 이로 인해 실수로 행 수가 늘어날 수 있습니다.

관련 문제