2014-07-08 68 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