안녕하세요. 서브쿼리 관련되어 질문드립니다. 0 7 1,735

by 조지조지 [SQL Query] SQL Query 쿼리작업 DB 구현 서브쿼리 [2018.03.13 21:55:24]


안녕하세요.

현재, DB 관련 업무를 맡고 있는 초보자 입니다.

다름이 아니라, 서브쿼리 관련되어 쿼리작성 과 구현이 어려워 질문좀 드리려 합니다.

 

* OLYUNI라는 유니폼을 가져간 ([ACRPAR].[nAssigned] = '1' ,[ACRPAR].[nDelivered] ='1' ) 인

PARPGG라는 유니폼을 가져간, [ACRPAR].[nAssigned] = '1' ,[ACRPAR].[nDelivered] ='1' )

결국 OLYUNI랑 PARPGG를 둘 다 가져간사람들의 RegistereNum을 뽑고 싶은 쿼리 입니다. 작업하던게 머릿속에서 떠나지가 않아 머릿속에 있던 쿼리를 구현한거라.. 정확하지 않을 수 있지만, 도와주시면 정말 감사하겠습니다ㅠㅠ

1.UNIPIT 안에 OLYUNI랑 PARPGG라는 키트정보를 담고 있습니다.

2. 'OLYUNI'랑 'PARPGG' 값을 가지고 있는 사람 들 중에

3. OLYUNI 에 해당하는 [ACRPAR].[nAssigned] = '1' ,[ACRPAR].[nDelivered] = '1' 을 동시에 충족하는 사람

4. 그리고, 3번 조건을 충족시키면서도 'PARPGG' 에도 해당되고, [ACRPAR].[nAssigned] = '1' ,[ACRPAR].[nDelivered] = '1' 인 사람의 목록을 뽑으려 합니다.

SELECT [UNIPIT].[nRegNum]
              ,[UNIPIT].[nUniKit]
              ,[ACRPAR].[nAssigned]
              ,[ACRPAR].[nDelivered]
              ,[UNIPIT_PAR].[nRegNum]
              ,[UNIPIT_PAR].[nUniKit]
              ,[UNIPIT_PAR].[nAssigned]
              ,[UNIPIT_PAR].[nDelivered]

FROM [MEV].[UNIFORM] AS UNIPIT

INNER JOIN [MEV].[PartiINFO] AS ACRPAR
ON [ACRPAR].[nRegNum] = [UNIPIT].[nRegNum]

          INNER JOIN ( SELECT [UNIPIT].[nRegNum]
              ,[UNIPIT].[nUniKit]
              ,[ACRPAR].[nAssigned]
              ,[ACRPAR].[nDelivered]
              ,[UNIPIT].[nRegNum]
              ,[UNIPIT].[nUniKit]
              ,[UNIPIT].[nAssigned]
              ,[UNIPIT].[nDelivered]
  
          FROM [MEV].[UNIFORM] AS UNIPIT

          INNER JOIN [MEV].[PartiINFO] AS ACRPAR 
          ON [ACRPAR].[nRegNum] = [UNIPIT].[nRegNum]

                                                )        AS UNIPIT_PAR

ON [UNIPIT].[nRegNum] = [UNIPIT_PAR].[nRegNum]

WHERE  [UNIPIT].[nUniKit] = 'OLYUNI'
          AND [UNIPIT].[nAssigned] = '1'
          AND [UNIPIT].[nDelivered] = '1'

AND  [UNIPIT_PAR].[nUniKit] = 'PARPGG'
          AND [UNIPIT_PAR].[nAssigned] = '1'
          AND [UNIPIT_PAR].[nDelivered] = '1'


by 마농 [2018.03.14 07:33:00]
SELECT a.nRegNum
  FROM mev.Uniform a
 INNER JOIN mev.PartiInfo b
    ON a.nRegNum = b.nRegNum
 WHERE a.nUniKit IN ('OLYUNI', 'PARPGG')
   AND b.nAssigned  = '1'
   AND b.nDelivered = '1'
 GROUP BY a.nRegNum
HAVING COUNT(DISTINCT a.nUniKit) = 2
;

 


by 조지조지 [2018.03.14 08:50:02]

@마농 마농님 감사합니다, 혹시 실례가 안된다면 HAVING COUNT(DISTINCT a.nUniKit) = 2
저 절에서 ' =2  ' 가 뭘 의미하는건지 알 수 있을까요? 제 생각엔 OLYUNI랑 PARPGG 를 카운트 한게 2이기 때문에, 위와 같은 Having 조건을 준건가요?
 근데, 이미 WHERE 절에서 IN ('OLYUNI', 랑 'PARPGG') 만을 포함한 건데 한번 더 주는 의유를 모르겠습니다! 도와주셔서 감사해요 :)


by 마농 [2018.03.14 08:58:12]

중복이 있을지 몰라 Distinct 했구요. 중복이 없다면 Distinct 는 빼시면 됩니다.
둘다 조건을 만족하면 2건이 나올것이고, 하나만 조건을 만족하면 1이 나오겠지요
요구조건이 두가지 모두 만족 아니었던가요?


by 아발란체 [2018.03.14 13:05:38]

마농님짱!


by 조지조지 [2018.03.14 14:01:18]

@마농님 정말 감사합니다! 실례지만, 하나더 여쭤봐도 될까요!
 저기서 a.nRegNum 뿐만 아니라  UNIPIT.UnkiKit, UNPIT.Assigned, UNPIT.Delivered 컬럼 또한 같이 출력하고 싶은데 위에선, Group by 로 묶여서 nRegNum 밖에 출력을 못하는 것 같더라고요 ㅠㅠ.. 말씀하신 것 처럼 요구조건은 두가지 모두 만족 맞습니다. 조그만 더 부탁드려도 될까요ㅠㅠ 감사합니다!


by 마농 [2018.03.14 14:31:51]

그 값들은 이미 내가 알고 있는 고정값인데? 왜 조회가 필요하죠?
 - nUniKit IN ('OLYUNI', 'PARPGG')
 - nAssigned  = '1'
 - nDelivered = '1'
굳이 하고자 한다면 할 수는 있으나...   왜 해야 하는지 모르겠네요?

SELECT a.nRegNum
     , 'OLYUNI' nUniKit_1
     , 'PARPGG' nUniKit_2
     , '1'      nAssigned
     , '1'      nDelivered
  FROM mev.Uniform a
 INNER JOIN mev.PartiInfo b
    ON a.nRegNum = b.nRegNum
 WHERE a.nUniKit IN ('OLYUNI', 'PARPGG')
   AND b.nAssigned  = '1'
   AND b.nDelivered = '1'
 GROUP BY a.nRegNum
HAVING COUNT(DISTINCT a.nUniKit) = 2
;
SELECT a.nRegNum
     , MIN(a.nUniKit   ) nUniKit_1
     , MAX(a.nUniKit   ) nUniKit_2
     , MIN(b.nAssigned ) nAssigned
     , MIN(b.nDelivered) nDelivered
  FROM mev.Uniform a
 INNER JOIN mev.PartiInfo b
    ON a.nRegNum = b.nRegNum
 WHERE a.nUniKit IN ('OLYUNI', 'PARPGG')
   AND b.nAssigned  = '1'
   AND b.nDelivered = '1'
 GROUP BY a.nRegNum
HAVING COUNT(DISTINCT a.nUniKit) = 2
;

 


by 조지조지 [2018.03.14 15:27:53]

@마농 감사합니다. 다름이 아니라, 이미 조건으로 줘도 요청하신분께서 그래도 RegNum에 따라 어떤 KIT를 가져갔는지를 테이블상으로 보고 싶어하셔서 부탁드린 것 입니다.
 저는 서브쿼리로, 막 머리굴리면서 이상하게 생각하는데 정말 심플하게 만들어주시는군요. ㅠㅠ 감사하고 잘 배웠습니다! 좋은 하루 되세요 감사드려요 !

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