2011-09-03 69 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)- 映射角色2工作[這是因爲工作表pr E-存在,這個新的應用程序只挑選某些作業ID來對付自己的角色表

表:RFMUSERROLE(USERROLE_CODE,USERROLE_ID)- 擁有用戶角色信息

現在我想獲取最後一次登錄(userhistory中該用戶的最大日期)詳細信息,包括任何登錄的特定人員的角色和工作人員詳細信息。我遇到了我的代碼問題,最後只是使用UH_datetime命令爲該用戶選擇了所有記錄desc所以我可以選擇最新的最高記錄。

請任何幫助表示讚賞。 這裏是我當前的代碼(非常低效如上所述):

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 

感謝,

LUHFLUH你問他們之前

回答

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

Oracle不會在網絡上發送行。如果您的客戶端代碼僅請求第一行,則您的查詢應該足夠高效。

另一種選擇是甲骨文限制一行與rownum

where rownum = 1 
+0

很抱歉,但我發現我可能有問題與該位置放置ROWNUM限制器和返回的不是最新的日行: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 ='1001100821'AND rownum = 1 ORDER BY b.UH_DATETIME DESC – luhfluh

+1

@luhfluh:Well 'by by'在'where'之後。所以你需要一個子查詢,'select * from(... old query ...)as subQueryAlias where rownum = 1'。通常比像'dense_rank()'這樣的分析函數要好一點。 – Andomar