SQL 쿼리질문드립니다. 0 12 1,904

by 긍률 [SQL Developer] [2017.01.05 14:57:07]


위에 그림에서 아래그림 처럼 같은 테이블에있는 컬럼간 중복으로 있는 값만 출력하고 싶은대 도저히 방법을 모르겠네요 ...

SELECT *
  FROM
 ( ~ MAX함수 ~ )
 )
 JOIN
 ( DISTINCT ~~~~
 )
 ~~~~~~~

이런 방식으로 구현해야합니다 ...

 

도움 부탁드립니다..

by jkson [2017.01.05 15:04:47]
with t as
(
select 1 col1, 1 col2 from dual union all
select 2 col1, 2 col2 from dual union all
select 3 col1, 1 col2 from dual union all
select 4 col1, 3 col2 from dual union all
select 5 col1, 4 col2 from dual union all
select 6 col1, 2 col2 from dual
)
select distinct a.col1, a.col1 col2
from t a
where exists (select 1 from t b where a.col1 = b.col2)
--intersect 이용
select col1, col1 col2
from t
intersect
select col2, col2
from t 

 


by 긍률 [2017.01.05 15:12:58]

감사합니다 ㅠㅠ...

하... INTERSECT 를 이용해서 하는게 아니였네요 .. 좀더 궁리 해봐야 될것 같습니다 ...


by 마농 [2017.01.06 09:24:57]

구현방식이 딱 정해져 있는 퀴즈인가요?
질문에 제시된 MAX 는 사용될 이유가 전혀 없어 보이네요.


by 긍률 [2017.01.06 09:48:05]

네 . 주어진 조건안에서만 쿼리를 작성해야 하는 경우가 있다고 하셔서 반드시 MAX함수가 들어가도록 출제된 문제 였습니다. 그냥 어거지로 MAX함수 넣고 끝내 버렸네요 ... ㅋㅋㅋㅋ


by jkson [2017.01.06 10:27:56]

어떻게 풀이하셨는지요?


by 마농 [2017.01.06 09:49:36]

문제는 그대로 옮기신건가요? 혹시 빼먹은 것은 없는지?

문제를 단 한글자도 빠짐 없이(공백이나 오타마져도) 그대로 옮겨보세요.


by 긍률 [2017.01.06 10:35:37]

네 문제 그대로 입니다.

아래가 제가 문제 풀이한 방식인대

조건에 맞게

 MAX함수를 이용한거를 보자고 하신것 같아요 . 

1
2
3
4
5
6
7
8
9
10
11
12
SELECT ONE.COL1
     , TWO.COL2 
  FROM (SELECT *
          FROM HRM_DB.DBO.TEST1 WITH(NOLOCK)
         WHERE COL1 <= (SELECT MAX(COL1) 
                          FROM HRM_DB.DBO.TEST1 WITH(NOLOCK)) 
       )ONE 
 INNER JOIN 
       (SELECT DISTINCT COL2
          FROM HRM_DB.DBO.TEST1 WITH(NOLOCK)
        )TWO
            ON ONE.COL1 = TWO.COL2
cs

 


by jkson [2017.01.06 10:51:38]

제가 만든 거 보다 더 의미있게 만드신 것 같은데요. 저는 의미없는 max인데용.

다만 아래 부분만 바꾸면 더 의미가 좋아지겠네요.

SELECT ONE.COL1
     , TWO.COL2 
  FROM (SELECT *
          FROM HRM_DB.DBO.TEST1 WITH(NOLOCK)
         WHERE COL1 <= (SELECT MAX(COL2
                          FROM HRM_DB.DBO.TEST1 WITH(NOLOCK)) 
       )ONE 
 INNER JOIN 
       (SELECT DISTINCT COL2
          FROM HRM_DB.DBO.TEST1 WITH(NOLOCK)
        )TWO
            ON ONE.COL1 = TWO.COL2

by jkson [2017.01.06 10:21:31]

아.. max, distinct join을 이용해서 해당 문제를 풀어보라는 거군요~ 저는 그냥 결과 값만 나오면 되는 줄 알고 댓글 달았었네요. 저 형태로 만들어 보라고 했다면 group by와 distinct, join에 대한 이해를 해보라는 말인 것 같네요.

with t as
(
select 1 col1, 1 col2 from dual union all
select 2 col1, 2 col2 from dual union all
select 3 col1, 1 col2 from dual union all
select 4 col1, 3 col2 from dual union all
select 5 col1, 4 col2 from dual union all
select 6 col1, 2 col2 from dual
)
select *
from
(
select max(col1) col1 -- max는 없어도 되는데.. 이상함
  from t
 group by col1
) a
join 
(
select distinct col2
  from t
) b
on a.col1 = b.col2

 


by 긍률 [2017.01.06 10:58:28]

JKSON 님 감사합니다


by 마농 [2017.01.06 11:18:39]

1. WITH(NOLOCK) 은
  - 습관적으로 붙이는 것인지? 정확한 용도를 알고 사용하는것인지?
2. 사용하신 Max 쿼리는
  - 무의미한 쿼리죠. 억지쿼리.
3. 제약조건이 좀더 있었으면 하는 문제입니다.
  - col1 항목은 유니크하다 라든지?
  - col2 항목은 col1 항목에 있는 것만 가능하다 라든지?


by 긍률 [2017.01.06 13:19:51]

1.WITH(NOLOCK)은 용도를 알고 습관적으로 붙이려고 노력하고 있습니다.

2.네 .. MAX함수를 이용해서 작성하는 제약조건에서 제가 생각해낸것의 한계인것같습니다..

   전혀 필요없는 쿼리이죠 ..

3.그렇게 제약조건을 가진 것으로 다시한번 문제 풀어 보겠습니다. 감사합니다.

 

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