我有两个名为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';
答案 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