2014-07-08 99 views
1

我有兩個名爲LOGIN和LOGIN_LOG的表。在LOGIN_LOG表中,每個用戶的每次登錄的日期時間被保存。在這兩個表中EMP_CODE是通用列。我必須從LOGIN_LOG表中選擇所有用戶名,登錄表中的所有用戶名和他們的「上次登錄時間」。我嘗試過這樣的東西,但沒有工作。請幫忙。oracle查詢不起作用

SELECT 
LOGIN."NAME", 
LOGIN.LOCATION, 
LOGIN.WORKING_STATUS, 
LV.LOGINDATETIME 
FROM 
LOGIN 
LEFT OUTER JOIN 
(SELECT 
LOGIN_LOG.EMP_CODE, 
LOGIN_LOG.LOGINDATETIME 
FROM LOGIN_LOG 
ORDER BY LOGIN_LOG.LOGINDATETIME DESC 
) AS LV 
ON LOGIN.EMP_CODE=LV.EMP_CODE 
WHERE LOGIN.USER_TYPE='NSA'; 
+1

解釋不起作用。 –

+0

它給錯誤ORA-00905:缺少關鍵字 – VIVEK

+0

@mareckmareck:絕對不是。列(標識符)使用雙引號引起來。單引號是字符文字。 –

回答

1

Oracle不支持將AS用作表別名。

另外,你的查詢沒有意義。派生表中不需要派生表,子派生表中的order by根本沒有任何意義。

因此,它應該是這樣的:

SELECT login.name, 
     login.location, 
     login.working_status, 
     lv.logindatetime 
FROM login 
    LEFT OUTER JOIN login_log lv ON login.emp_code = lv.emp_code 
WHERE login.user_type = 'NSA' 

編輯:我忽略了你的要求,獲得最後登錄:

SELECT login.name, 
     login.location, 
     login.working_status, 
     lv.logindatetime 
FROM login 
    LEFT JOIN (
    select emp_code, max(logindatetime) as logindatetime 
    from login_log 
    group by emp_code 
) lv ON login.emp_code = lv.emp_code 
WHERE login.user_type = 'NSA' 
+0

無法正常工作。如果login_log.logindatetime是lv,那麼這個列怎麼可能是lv.emp_code。錯誤是ORA-00942:表或視圖不存在 – VIVEK

+0

@ user3807573:對不起,我剛剛複製了你的代碼。忽略了你所犯的錯誤。現在更正 –

+0

我已經做到了,但它給了所有logindateTime,但我必須只選擇每個用戶的最後登錄日期時間,如我的問題中所述。 – VIVEK

0

以上查詢是有點混亂。在我看來,子查詢是錯誤的。加入後,不能依賴任何結果排序。換句話說,如果你有一個表A和一個表B,這兩個表都被排序並且你建立了一個連接,你也不能確定連接結果是否被排序。

我建議(不知道什麼是「不工作」你的情況表示):

SELECT L."NAME", L.LOCATION, L. WORKING_STATUS, LG.LOGINDATETIME 
FROM LOGIN L 
JOIN LOGIN_LOG LG on L.EMP_CODE=LG.EMP_CODE 
WHERE L.USER_TYPE='NSA' 
ORDER BY LG.LOGINDATETIME DESC 

總是喜歡如果可能的話加入了子查詢,因爲數據庫管理系統可以處理他們更好(與優化,指數,等)

編輯:

當然

,在這裏不需要的LEFT OUTER JOIN和可能產生的查詢執行的開銷,從而更好地利用改爲。

EDIT2:

我想現在我的問題。您需要使用一個GROUP BY而不是一個ORDER BY

SELECT L."NAME", L.LOCATION, L. WORKING_STATUS, MAX(LG.LOGINDATETIME) AS LOGINDATETIME 
FROM LOGIN L 
JOIN LOGIN_LOG LG on L.EMP_CODE=LG.EMP_CODE 
WHERE L.USER_TYPE='NSA' 
GROUP BY L."NAME", L.LOCATION, L.WORKING_STATUS 
+0

我已經做到了,但它是給所有logindateTime,但我必須只選擇每個用戶的最後登錄日期時間,如我的問題 – VIVEK

+0

感謝您的建議。 – VIVEK

+0

所以你需要爲每個用戶上次登錄的日期時間? – paubo147