SQL 쿼리질문드립니다. 12 267

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.그렇게 제약조건을 가진 것으로 다시한번 문제 풀어 보겠습니다. 감사합니다.