oracle查询不起作用

时间:2014-07-08 07:31:13

标签: sql oracle join

我有两个名为LOGIN和LOGIN_LOG的表。在LOGIN_LOG表中,保存每个用户的每次登录的日期时间。在两个表中,EMP_CODE是公共列。我必须从登录表中选择所有用户名,位置以及他们的最后登录时间"来自LOGIN_LOG表。我尝试过类似的东西,但没有工作。请帮忙。

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';

2 个答案:

答案 0 :(得分: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'

答案 1 :(得分: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

如果可能的话,总是更喜欢连接子查询,因为dbms可以更好地处理它们(使用优化,索引等)。

修改

当然,此处不需要LEFT OUTER JOIN,可能会在查询执行程序中产生开销,因此最好使用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