두개의 컬럼을 in 키워드를 사용해서 where 조건에 사용하는 방법 좀 아르켜주세요~ 0 4 3,761

by phil [MySQL] [2011.07.02 23:07:29]



SELECT * FROM TBLTRANHIST
WHERE (STRACCTIDNO , STRTRANDATE) IN
(SELECT STRACCTIDNO , MAX(STRTRANDATE) FROM TBLTRANHIST a group by STRACCTIDNO)

위의 쿼리를 사용하면 에러가 발생합니다.

in 술어를 사용해서 두개 컬럼을 where 조건에 동일하게 활용할려고 하는데요.

이거 왜 안되는지 모르겠네요.

고수 분들의 답변을 부탁드립니다.

감사합니다.

by 마농 [2011.07.04 10:05:18]
오라클에선 문제 없는 쿼리인데요.
일단 단순하게 [안된다]라는 말보다는
어떻게 안되는지? 오류가 난다면 에러메세지를 확인해 보세요.
에러메세지에 많은것이 담겨있습니다.

by phil [2011.07.04 12:27:34]
답변해 주셔서 감사합니다. 마농님. 헌데 제가 잘못 말씀드린게 있네요.
mysql에서 위의 쿼리 구문이 잘 동작하는데요. 제가 ms sql용으로 여쭤본다는게
mysql 게시판에 적었네요. 마농님. 위의 쿼리를 동일하게 ms sql에 적용하면
syntax 에러가 나오는데요. ms sql에서 위와 같은 기능을 수행하는 쿼리를 수행할려면 어떻게 해야 하는지 아시면 답변 부탁드리겠습니다.~~^^

by 마농 [2011.07.04 13:32:04]
기본적인 구문이라 특별히 안될 이유는 없어 보입니다.
구체적인 오류메시지 한번 더 확인해 보시구요.
MAX(STRTRANDATE) AS STRTRANDATE 처럼 혹시 모르니 Alias 한번 줘 보시구요.


같은 기능을 다르게 구현해보면... 오라클 기준입니다만 크게 다르지 않습니다.
SELECT *
FROM tbltranhist b
WHERE b.strtrandate = (SELECT MAX(a.strtrandate) FROM tbltranhist a WHERE a.stracctidno = b.stracctidno)
;

SELECT b.*
FROM tbltranhist b
, (SELECT stracctidno, MAX(strtrandate) AS strtrandate FROM tbltranhist GROUP BY stracctidno) a
WHERE a.stracctidno = b.stracctidno
AND a.strtrandate = b.strtrandate
;

SELECT *
FROM
(
SELECT b.*
, ROW_NUMBER() OVER(PARTITION BY stracctidno ORDER BY strtrandate DESC) AS rn
FROM tbltranhist b
)
WHERE rn = 1
;

by TeLl2 [2011.07.04 14:10:47]
정확히 기억 나지 않치만
mssql에서는 두개의 컬럼을 in 절에서 사용하지 못했던 걸로 기억됩니다.
(최신 버전에서는 될지 모르지만)
mssql에서 위와 같은 조회를 하실려면
마농님 이 제시해 주신 대채SQL을 사용하시면 될듯합니다.
세번째 쿼리의 경우는 mssql 2005이상에서만 사용가능합니다.
댓글등록
SQL문을 포맷에 맞게(깔끔하게) 등록하려면 code() 버튼을 클릭하여 작성 하시면 됩니다.
로그인 사용자만 댓글을 작성 할 수 있습니다. 로그인, 회원가입