2011-09-03 3 views
0

검색 할 관련 정보가있는 테이블이 4 개 있습니다.여러 테이블의 최대 날짜 반환 oracle

테이블 : Staff_profile (STAFF_ID, STAFF_USERNAME, STAFF_NAME, STAFF_JOB_ID, STAFF_FACULTY_ID, STAFF_OFF_TEL, STAFF_EMAIL는)은 - 직원 정보를 보유하고

테이블 : RFMUSERHISTORY (uh_staff_id, UH_DATETIME)는 - 로그인 역사를 보유하고

테이블 : RFMUSERROLEJOBMAP (role_id, job_id)- maps role-2-job [이것은 작업 테이블 pr 전자는-존재하고이 새로운 응용 프로그램은

표 자신의 역할 테이블에 대해 사용하는 특정 작업 ID를 따기입니다 : RFMUSERROLE (USERROLE_CODE, USERROLE_ID)가 - 지금은 원하는 보유하고 사용자 역할 정보를

을 로그인 한 특정 사용자의 역할 및 직원 세부 정보를 포함하여 마지막 로그인 (userhistory에서 해당 사용자의 최대 날짜)을 얻습니다. 내 코드에 문제가있어 마침내 UH_datetime을 사용하여 해당 사용자의 모든 레코드를 선택했습니다. 내 최신 기록을 골라야 겠어.

제발 도와주세요.

SELECT a.STAFF_ID, a.STAFF_USERNAME, a.STAFF_NAME, a.STAFF_JOB_ID, a.STAFF_FACULTY_ID, 
    a.STAFF_OFF_TEL, a.STAFF_EMAIL, to_CHAR(b.UH_DATETIME,'Dy DD-MM-YYYY HH24:MI:SS') 
    AS UH_DATETIME, e.USERROLE_CODE, e.USERROLE_ID 
     FROM STAFF_PROFILE a 
     LEFT JOIN RFMUSERHISTORY b ON STAFF_ID=b.uh_staff_id 
     LEFT JOIN RFMUSERROLEJOBMAP d ON a.STAFF_JOB_ID=d.job_id 
     LEFT JOIN RFMUSERROLE e ON d.role_id=e.userrole_id 
     WHERE STAFF_ID=:eid1 ORDER BY b.UH_DATETIME DESC 

감사합니다, 당신이 그들을 요청하기 전에

답변

3

당신은 행을 평가하고 가장 최근의 하나를 선택하는 분석 함수를 사용할 수 있습니다. 실제로 하나의 STAFF_ID에 대한 데이터 만 선택하는 경우 ROWNUM 술어를 사용하여 행을 선택하는 외부 쿼리에서 원래 쿼리를 중첩하는 것보다 효율적일 수 있습니다. 그러나 여러 직원의 데이터를 선택하는 경우보다 효율적입니다.

SELECT * 
    FROM (
    SELECT a.STAFF_ID, 
      a.STAFF_USERNAME, 
      a.STAFF_NAME, 
      a.STAFF_JOB_ID, 
      a.STAFF_FACULTY_ID, 
      a.STAFF_OFF_TEL, 
      a.STAFF_EMAIL, 
      to_CHAR(b.UH_DATETIME,'Dy DD-MM-YYYY HH24:MI:SS') AS UH_DATETIME, 
      e.USERROLE_CODE, 
      e.USERROLE_ID, 
      dense_rank() over (partition by a.staff_id order by b.uh_datetime desc) rnk 
     FROM STAFF_PROFILE a 
      LEFT JOIN RFMUSERHISTORY b ON STAFF_ID=b.uh_staff_id 
      LEFT JOIN RFMUSERROLEJOBMAP d ON a.STAFF_JOB_ID=d.job_id 
      LEFT JOIN RFMUSERROLE e ON d.role_id=e.userrole_id 
     WHERE STAFF_ID=:eid1 
    ) 
WHERE rnk = 1 
+0

. 언급 한 바와 같이, 단일 직원 또는 모든 직원 결과에 대해 작업 할 수 있습니다. 새로운 교훈을 얻었습니다. – luhfluh

1

오라클이 네트워크를 통해 행을 보내지 않습니다

LUHFLUH : 여기에 내 현재 코드 (전술 한 바와 같이 매우 비효율적)입니다. 클라이언트 코드가 첫 번째 행만 요청하면 쿼리는 충분히 효율적이어야합니다.

또 다른 옵션은 rownum 하나의 행에 오라클을 제한하는 것입니다 :

where rownum = 1 
+0

미안하지만 난이 ROWNUM 제한 및 최신 날짜가되지 반환 된 행 배치 할 위치에 문제가있을 수 있습니다주의 : a.STAFF_ID, a.STAFF_USERNAME, a.STAFF_NAME, a.STAFF_JOB_ID을 선택, STAFF_PROFILE로부터 a.STAFF_FACULTY_ID, a.STAFF_OFF_TEL, a.STAFF_EMAIL, to_CHAR (b.UH_DATETIME, 'Dy DD-MM-YYYY HH24 : MI : SS') AS UH_DATETIME, e.USERROLE_CODE, e.USERROLE_ID 왼쪽 잠금 RFMUSERHISTORY b ON STAFF_ID = b.uh_staff_id LEFT JOIN RFMUSERROLEJOBMAP d ON a.STAFF_JOB_ID = d.job_id LEFT JOIN RFMUSERROLE e ON d.role_id = e.userrole_id WHERE STAFF_ID = '1001100821'AND rownum = 1 ORDER BY b.UH_DATETIME DESC – luhfluh

+1

@luhfluh : 음 'order by '는'where' 다음에옵니다. 따라서 하위 쿼리 'select * from (... old query ...)는 SubQueryAlias ​​where rownum = 1'로 필요합니다. 일반적으로'dense_rank()'와 같은 분석 함수보다 조금 더 잘 수행됩니다. 도움을 주신 덕분에 – Andomar