다른 방식의 조회 SQL 인대 , 쿼리 결과가 다르게 나올수도 있나요? 0 5 4,159

by 유환 [SQL Query] [2024.12.12 22:18:43]


2개의 쿼리는 동일 테이블과 동일 조건입니다.

단 하나는 UNION ALL 로 가져오고 하나는 풀아우터 조인 방식으로 가져 왔습니다.

데이터가 몃개 없어서 결과는 동일한대 혹시 결과가 다르게 나올수도 있을가요?

   WHERE A.PJT = 'ZRE'    AND TYPE = 'P' 이조건으로 데이터는 여러건 나옵니다.

 

 

 

SELECT RN, CLASS, MAX(C1) AS C1 , MAX(C2) AS C2 ,MAX(C3) AS C3, MAX(C4) AS C4 , MAX(C5) AS C5 , MAX(C6) AS C6 , MAX(C4) AS C7 , MAX(C5) AS C8 , MAX(C6) AS C9
FROM (
       SELECT ROW_NUMBER() OVER (PARTITION BY CLASS ORDER BY CLASS DESC) AS RN , CLASS
            , FROM_S AS c1 , TO_S AS c2, DESCRT AS c3 , '' AS c4 , '' AS c5, '' AS c6 , '' AS c7 , '' AS c8, '' AS c9
           FROM EMPT A
           WHERE A.PJT = 'ZRE'        
           AND TYPE = 'P'
       
       UNION ALL  
       
        SELECT ROW_NUMBER() OVER (PARTITION BY CLASS ORDER BY CLASS DESC) AS RN , CLASS
            , '' AS c1 , '' AS c2, '' AS c3 , FROM_S AS c4 , TO_S AS c5, DESCRT AS c6   , '' AS c7 , '' AS c8, '' AS c9
           FROM EMPT A
           WHERE A.PJT = 'ZRE'        
           AND TYPE = 'F'
           
             UNION ALL   
             
        SELECT ROW_NUMBER() OVER (PARTITION BY CLASS ORDER BY CLASS DESC) AS RN , CLASS
            , '' AS c1 , '' AS c2, '' AS c3 ,  '' AS c4 , '' AS c5, '' AS c6 , FROM_S AS c7 , TO_S AS c8, DESCRT AS c9
           FROM EMPT A
           WHERE A.PJT = 'ZRE'       
           AND TYPE = 'B'
    
    )
    GROUP BY CLASS, RN  
    ORDER BY CLASS  , RN
    
/////////////////////////////////

WITH
DTL AS (
    SELECT ROW_NUMBER() OVER (PARTITION BY CLASS ORDER BY CLASS DESC) AS RN , CLASS
        , FROM_S AS c1 , TO_S AS c2, DESCRT AS c3 
    FROM EMPT A
    WHERE A.PJT = 'ZRE'  
    AND TYPE = 'P'
)
,
ING AS (
 SELECT ROW_NUMBER() OVER (PARTITION BY CLASS ORDER BY CLASS DESC) AS RN , CLASS
       ,  FROM_S AS c1 , TO_S AS c2, DESCRT AS c3 
    FROM EMPT A
    WHERE A.PJT = 'ZRE'   
    AND TYPE = 'F'
)
,
VB AS (
   SELECT ROW_NUMBER() OVER (PARTITION BY CLASS ORDER BY CLASS DESC) AS RN , CLASS
       ,  FROM_S AS c1 , TO_S AS c2, DESCRT AS c3 
      FROM EMPT A
      WHERE A.PJT = 'ZRE'   
      AND TYPE = 'B'
)
SELECT A.RN, A.CLASS, A.C1, A.C2, A.C3 , B.C1, B.C2, B.C3 ,  C.C1, C.C2, C.C3
 FROM DTL           A
FULL OUTER JOIN ING B ON A.RN = B.RN  AND A.CLASS = B.CLASS 
FULL OUTER JOIN VB  C ON COALESCE(A.RN, B.RN) = C.RN  AND COALESCE(A.CLASS, B.CLASS) = C.CLASS 
ORDER BY A.CLASS , RN

by 우주민 [2024.12.13 15:41:48]

실 데이터로 테스트 한건 아니라서 로직적으로 봤을때....
일단 데이터는 동일하게 나오는게 맞아 보입니다.
(하지만 제가 생각 못한 오류가 있을 수는 있습니다.)
첫번째 쿼리를 이용해 동일한 결과가 나오는 다른 쿼리도 작성해봤습니다.
(물론 이것도 정확하다고 확답은... 흠...)

SELECT RN, CLASS, MAX(C1) AS C1 , MAX(C2) AS C2 ,MAX(C3) AS C3, MAX(C4) AS C4 , MAX(C5) AS C5 , MAX(C6) AS C6 , MAX(C4) AS C7 , MAX(C5) AS C8 , MAX(C6) AS C9
FROM (
       SELECT ROW_NUMBER() OVER (PARTITION BY CLASS, TYPE ORDER BY CLASS DESC) AS RN 
            , CLASS
            , CASE WHEN TYPE = 'P' THEN FROM_S END  AS c1
            , CASE WHEN TYPE = 'P' THEN TO_S   END  AS c2
            , CASE WHEN TYPE = 'P' THEN DESCRT END  AS c3
            , CASE WHEN TYPE = 'F' THEN FROM_S END  AS c4
            , CASE WHEN TYPE = 'F' THEN TO_S   END  AS c5
            , CASE WHEN TYPE = 'F' THEN DESCRT END  AS c6
            , CASE WHEN TYPE = 'B' THEN FROM_S END  AS c7
            , CASE WHEN TYPE = 'B' THEN TO_S   END  AS c8
            , CASE WHEN TYPE = 'B' THEN DESCRT END  AS c9
           FROM EMPT A
           WHERE A.PJT = 'ZRE'        
           AND TYPE IN ('P', 'F','B')
    )
    GROUP BY CLASS, RN  
    ORDER BY CLASS, RN

by 유환 [2024.12.17 23:47:10]

쿼리로 예도 만들어 주시고 

감사합니다.


by 마농 [2024.12.17 08:30:44]

1. 정렬 기준이 무의미한 기준입니다.
- partition by 와 order by 의 기준이 동일한 값입니다.
- 이 경우 파티션 내 정렬값이 모두 동일하므로 어떻게 정렬이 되어 나올지 모릅니다.
- 그렇기 때문에 결과가 동일하다고 보장할 수 없을 듯 합니다.
- 정렬 기준으로 유니크한 항목을 사용해야 합니다. (예 : PK 항목)
2. 불필요한 반복 테이블 스캔
- 한번만 읽으면 됩니다.
- 우주민님 답변 참고


by 유환 [2024.12.17 23:43:31]

감사합니다.

위드문에 EMPT  넣어 놓고 아래  위드문에서 반복하여 사용이라 한번 읽고 있습니다.

1번처럼 하니 컬럼이 30개만  되도 짝을 맟추여야 하니깐 '' 으로 쓰는것도  일이더라구요.

2번처럼 하고 정렬만 해결되면 좀 간결해져 2번처럼 하려고 합니다.

정렬을 제외한 데이터는 동일하면 2번처럼 하려고요


by 마농 [2024.12.18 08:33:58]

1. With 문이라 한번이라고요?
- 물리적 읽기는 한번일지 몰라도 논리적 읽기는 여러번이 됩니다.
2. 1번처럼 2번처럼은 질문의 쿼리를 말하는 건가요?
- 질문의 쿼리는 둘 다 버리시고 우주민님 답변 형태의 쿼리를 사용해야 합니다.
3. 정렬은 중요한 요소입니다.
- 중복값이 아닌 유니크한 값으로 정렬하셔야 합니다.

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