두 번 퀴리를 하는게 아니라 결국 서브쿼리를 사용해서 해결을 하는 것입니다.
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이 필요합니다.'
: : : 고수님들의 조언을 구합니다.
|