델맨 님이 쓰신 글 :
: 답변 감사합니다.
: 도움이 많이 되었습니다.
: 음... 결국 서브쿼리를 써서 사용하기로 했습니다.
: 감사합니다.
:
: 푸른솔 님이 쓰신 글 :
: : 두 번 퀴리를 하는게 아니라 결국 서브쿼리를 사용해서 해결을 하는 것입니다.
: : select문장이 두 번 있어서 속도를 의심하겠지만 LOGDATETIME에 인덱스를 걸어두면
: : 속도차이는 없습니다. 즉, 아무리 복잡한 쿼리라도 인덱싱만 잘 되어 있다면 속도문제는
: : 걱정 안해도 됩니다. 그것이 노하우이겠지만........
: :
: : 또 다른 방법이 있다는 in-line view를 사용하는 방법입니다.
: :
: : SELECT LOGDATETIME , LOGTYPE
: : FROM TBLLOG A,
: : ( SELECT MAX(LOGDATETIME) FROM TBLLOG WHERE LOGEMPID = 'user1' ) B
: : WHERE A.GDATETIME = B.LOGDATETIME
: :
: : 유사하지만.....
: : 참고로 이 in-line view는 FB 2.0이상에서만 지원하고, 그 이전 버전에서는 사용할 수 없는 문법이었죠.
: : 쿼리를 많이 하다 보면 in-line view를 무수히 많이 사용하게 될 겁니다.
: : 처음 질문처럼 간단하게 할려면 퀴리로는 안되고 Table구조를 조정해서 해야 할 겁니다.
: : Table 구조를 잘 설계해 놓으면 그 만큼 쿼리도 쉬워집니다...
: : 그것은 연구를 해 보시길.......
: :
: :
: : 델맨 님이 쓰신 글 :
: : : 푸른솔님 답변 감사합니다.
: : : 그렇다면 max값을 먼저 구하고
: : : logtype 이렇게 두번쿼리를 해야한다는 이야긴지요?
: : :
: : : SELECT
: : : LOGDATETIME , LOGTYPE
: : : FROM
: : : TBLLOG
: : : WHERE
: : : LOGDATETIME = ( SELECT MAX(LOGDATETIME) FROM TBLLOG WHERE LOGEMPID = 'user1' )
: : : 이런식으로 두번 쿼리 해야 한다는 말씀인지요.
: : : 이렇게 해보았더니 되기는 하는데 한방에 쿼리를 실행하는게 아니라
: : : 두번 나누어서 한다는게 조금 걸립니다.
: : : 혹시 다른 방법이 있는지요.
: : :
: : : 푸른솔 님이 쓰신 글 :
: : : : SELECT MAX(LOGDATETIME)
: : : : 그렇다면 select문에서 LOGTYPE을 제거하면 되겠죠...
: : : :
: : : : LOGTYPE별로 그루핑을 하면 당연히 아래와 같은 결과가 나옵니다.
: : : : (LOGTYPE이 여러가지라면)
: : : :
: : : :
: : : :
: : : : 델맨 님이 쓰신 글 :
: : : : : 제가 원하는 결과는
: : : : : LOGDATETIME LOGTYPE
: : : : : -------------------------------
: : : : : 2007-02-01 22:11:30 LOGOUT
: : : : : 이렇게 최종 시간 기준으로 레코드 한개만 읽어오기를 원합니다.
: : : : :
: : : : : 그런데 아래의 쿼리로 해보면
: : : : : -------------------------------------
: : : : : SELECT
: : : : : MAX(LOGDATETIME) , LOGTYPE
: : : : : FROM
: : : : : TBLLOG
: : : : : WHERE
: : : : : LOGEMPID = 'user1'
: : : : : GROUP BY
: : : : : LOGTYPE;
: : : : : -------------------------------------
: : : : :
: : : : : LOGDATETIME LOGTYPE
: : : : : -------------------------------
: : : : : 2007-02-01 22:11:30 LOGOUT
: : : : : 2007-02-01 20:10:22 LOGIN
: : : : :
: : : : : 이렇게 2개의 레코드가 나옵니다.
: : : : : GROUP BY를 빼고 하면 에러가 나고 넣으면 LOGTYPE에 입력된 각각의 값중에서
: : : : : 최대값을 가져오는데 저는 최대값을 가진 레코드의 LOGTYPE이 필요합니다.'
: : : : : 고수님들의 조언을 구합니다.
안녕하세요. 까막입니다.
이 경우는 MAX 를 사용하실게 아니라 FIRST 를 사용하셔야 하는데요.
SELECT FIRST 1 LogDateTime, LogType
FROM TBLLOG
WHERE LogEmpId = 'user1'
ORDER BY LogDateTime DESC
이렇게 해보세요.
FIRST N 이 결과값 중에서 N개의 레코드만 가지고 오는 명령이거든요.
위대한 단군혼이 살아있는 나라.... 대한민국.
|