쿼리 단순화 0 3 669

by 기훈 [MySQL] [2021.01.12 09:19:00]


안녕하세요 쿼리를 좀 단순화 하고 싶은데 가르침 부탁드립니다.

 

SELECT
    *
FROM(
    SELECT
        A.bp_seq
        , SUM(A.a18) AS sum18
        , SUM(A.a11) AS sum11
        , SUM(A.qty) AS sumqty
    FROM(
        SELECT
            bp_seq
            , IF(num1 <= 18 AND 18 <= num2, qty, 0) AS a18
            , IF(num1 <= 11 AND 11 <= num2, qty, 0) AS a11
            , qty
        FROM
        (
            SELECT
                p1.bp_seq
                , p2.num1
                , p2.num2
                , p1.qty
            FROM
                p1
            INNER JOIN
                p2
            ON
                p2.seq = p1.p2_seq
        ) AS q
    ) AS A
    GROUP BY A.bp_seq
) AS sum_table
WHERE
    sum_table.sum18 >= 3 AND sum_table.sum11 >= 1

by 마농 [2021.01.12 09:54:31]
SELECT p1.bp_seq
     , IFNULL(SUM(CASE WHEN 18 BWTWEEN p2.num1 AND p2.num2 THEN p1.qty END), 0) sum18
     , IFNULL(SUM(CASE WHEN 11 BWTWEEN p2.num1 AND p2.num2 THEN p1.qty END), 0) sum11
  FROM p1
 INNER JOIN p2
    ON p2.seq = p1.p2_seq
 GROUP BY p1.bp_seq
HAVING IFNULL(SUM(CASE WHEN 18 BWTWEEN p2.num1 AND p2.num2 THEN p1.qty END), 0) >= 3
   AND IFNULL(SUM(CASE WHEN 11 BWTWEEN p2.num1 AND p2.num2 THEN p1.qty END), 0) >= 1
;

 


by 기훈 [2021.01.12 10:11:16]

감사합니다!!

혹시

HAVING sum18 >= 3

   AND sum11 >= 1

과 같이 사용해도 될까요?

그리고 궁금한것이 있습니다.

테이블 구조는 비교적 단순하지만 group by를 사용하게 되어 Using temporary 하게 되는데

임시 테이블을 사용안할수는 없겠죠?

p2.seq, p1.p2_seq, p1.bp_seq 각각 인덱스가 걸려있습니다.


by 마농 [2021.01.12 10:54:31]

HAVING sum18 >= 3 처럼 사용해도 되긴 하지만... 권장하지 않습니다.
표준에 어긋나는 오류 문법이며, MySQL 에서만 허용되는 구문입니다.
조금 복잡하더라도 표준 구문을 사용하는 게 좋습니다.

댓글등록
SQL문을 포맷에 맞게(깔끔하게) 등록하려면 code() 버튼을 클릭하여 작성 하시면 됩니다.
로그인 사용자만 댓글을 작성 할 수 있습니다. 로그인, 회원가입