group by밖엔 없는지 1 7 3,254

by 도라지요 [SQL Query] group by distinct [2014.12.09 16:10:44]


WITH
    T1 AS -- 10만건
    (
                  SELECT '1' PK1, '1' PK2, '1' PK3  FROM DUAL
        UNION ALL SELECT '1' PK1, '1' PK2, '2' PK3  FROM DUAL
        UNION ALL SELECT '1' PK1, '1' PK2, '3' PK3  FROM DUAL
    )
  , T2 AS -- 50만건
    (
                  SELECT '1' PK1, '1' PK2, '1' PK3, 'A' PK4, 'aa' COL1  FROM DUAL
        UNION ALL SELECT '1' PK1, '1' PK2, '1' PK3, 'B' PK4, 'bb' COL1  FROM DUAL
        UNION ALL SELECT '1' PK1, '1' PK2, '2' PK3, 'A' PK4, 'aa' COL1  FROM DUAL
        UNION ALL SELECT '1' PK1, '1' PK2, '2' PK3, 'B' PK4, 'aa' COL1  FROM DUAL
        UNION ALL SELECT '1' PK1, '1' PK2, '3' PK3, 'A' PK4, 'aa' COL1  FROM DUAL
    )
  , T3 AS -- 20만건
    (
                  SELECT 'aa' COL1, '11' COL2  FROM DUAL
        UNION ALL SELECT 'bb' COL1, '22' COL2  FROM DUAL
        UNION ALL SELECT 'cc' COL1, '33' COL2  FROM DUAL
        UNION ALL SELECT 'dd' COL1, '44' COL2  FROM DUAL
        UNION ALL SELECT 'ee' COL1, '55' COL2  FROM DUAL
    )
SELECT T1.*, T3.COL2
FROM T1, T2, T3
WHERE T1.PK1 = T2.PK1
  AND T1.PK2 = T2.PK2
  AND T1.PK3 = T2.PK3
  AND T2.COL1 = T3.COL1(+)
 
  AND T3.COL2 = '11'
  -- T1 기본, T2 상세로 1:다 일때 T2.COL1=T3.COL2 일때 조회조건으로 T3.COL2를 검색조건으로 조회시
  -- 해당하는 T1데이터와 T3의COL2값을  조회하려할때 (T2중복은 제거)
  -- T1의 컬럼이 한 50개쯤되는데.. T1의pk키로 group by 를 하면 max로 도배를 해야하는데 이게 맞는건지;; 다른방법이 없는지 문의드립니다.

결국은 T1기준으로 조회하는데 T3의 col2값으로 조회하고 싶은거죠; T2의 col1과 T3의 col2는 1:1이고...

by 마농 [2014.12.09 16:48:31]

아우터 조인을 건 테이블에 (+) 없이 조건을 준것이 맞나요?
이러면 아우터 조인이 아닌 이너조인 결과가 나옵니다.
원하시는 결과가 t1 이 모두 나오면서 조건 만족 여부를 표시하는 것인지?
아니면 조건을 만족하는 t1 만 나오면 되는 것인지?


by 도라지요 [2014.12.09 17:14:17]

답글 감사합니다~~

T1과 T2 사이에는 1:다 고 t1에 1건있을경우 t2에 최소 1건이상 있어서 +는 뺏구요

t1이 모두 나오면서 t3의 col2도 실제 데이터를 가져와야됩니다.


by lovekod2hj [2014.12.09 17:21:30]

t1을 조회하는데 t3에 있는 값으로 조회한다면 exists 이용하시면 될거 같습니다.
 

SELECT A.*
  FROM T1 A
 WHERE EXISTS (SELECT 1
                 FROM T2, T3
                WHERE T2.COL1 = T3.COL1    
                  AND T2.PK1 = A.PK1
                  AND T2.PK2 = A.PK2
                  AND T2.PK3 = A.PK3
                  AND T3.COL2 = '11')
;


by lovekod2hj [2014.12.09 17:25:26]

T1과 T2가 1:n이고 T2와 T3가 1:1가 T1과 T3는 당연히 1:n이 되는데

T3값을 어떻게 보여줄지를 알아야 될거 같은데요.
 


by 도라지요 [2014.12.09 17:35:05]

max처리로 나타내는데.. 헉.. 생각해보니.. 그냥 조회 조건으로 가져온 값을 그대로 뿌려줘도 무방하겠네요.. t1 만 나타내면 distinct 처리하고 그룹바이로 굳이 max 처리를 할필요 없으니...

아래 첨부한 쿼리에 t1의 타행들을 그룹바이 처리하면서 전부 max로 감싸야해서 이방법밖에 없나 햇거든요.

-- 라고 생각했는데; 조회조건 없을때도 col2를 뿌려주긴해야되네요;; max로..크허


by 도라지요 [2014.12.09 17:32:41]

지금 적용중인건 이렇습니다만

SELECT
     A.PK1
     ,A.PK2
     ,A.PK3
    -- 그외 T1 컬럼 다수 50개 정도.. max(컬럼) 처리 <- 이걸 꼭하는수밖에 없나.. 최선인가;;해서;;
    ,MAX(B.COL2) AS COL2
FROM
(          
    SELECT T1.*, T2.COL1
    FROM T1, T2
    WHERE T1.PK1 = T2.PK1
      AND T1.PK2 = T2.PK2
      AND T1.PK3 = T2.PK3
      -- T1 조회조건 동적생성
) A, T3 B
WHERE 1=1
  AND A.COL1 = B.COL1(+)
  AND B.COL2 = :PARAM  -- 11  얘도 동적조회조건
GROUP BY A.PK1, A.PK2, A.PK3

 

-- 감사한 답글들 참고해서 좀더 고민해보겠습니다^^ 감사합니다~


by lovekod2hj [2014.12.09 17:52:07]

t3.col2의 조건으로 데이터를 보여준다면 t2와 t3를 조인해서 조회하고

group by t2.pk1, t2.pk2, t2.pk3 한 이후에 t1을 이너 조인으로 가져오도록 처리하면

어떨까요? 좋은 결과 얻으시길 바랍니다.


SELECT /*+ ORDERED */ T1.*, A.COL2
  FROM
       (SELECT t2.pk1, t2.pk2, t2.pk3, MAX(T3.COL2) AS COL2
          FROM T2
             , T3
         WHERE T2.COL1 = T3.COL1
           AND T3.COL2 = '11'
         GROUP BY t2.pk1, t2.pk2, t2.pk3) A
     , T1
 WHERE A.PK1 = T1.PK1
   AND A.PK2 = T1.PK2
   AND A.PK3 = T1.PK3
;

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