Sql oracle查询不工作

Sql oracle查询不工作,sql,oracle,join,Sql,Oracle,Join,我有两个名为LOGIN和LOGIN\u LOG的表。在登录日志表中,保存每个用户每次登录的日期时间。在这两个表中,EMP_代码是公共列。我必须从登录表中选择所有用户名、位置,并从登录日志表中选择它们的“上次登录时间”。我试过这样的东西,但不起作用。请帮忙 SELECT LOGIN."NAME", LOGIN.LOCATION, LOGIN.WORKING_STATUS, LV.LOGINDATETIME FROM LOGIN LEFT OUTER JOIN (SELECT LOGIN

我有两个名为LOGIN和LOGIN\u LOG的表。在登录日志表中,保存每个用户每次登录的日期时间。在这两个表中,EMP_代码是公共列。我必须从登录表中选择所有用户名、位置,并从登录日志表中选择它们的“上次登录时间”。我试过这样的东西,但不起作用。请帮忙

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

Oracle不支持将
用作表别名的

另外,你的质疑毫无意义。外部查询不需要派生表,派生表或子查询中的
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'

上面的查询有点混乱。在我看来,子查询是错误的。您不能依赖于联接后结果的任何顺序。换句话说,如果你有一个表a和一个表B,它们都已排序,并且你进行了联接,那么你不能确定联接的结果是否也已排序

我建议(不知道在你的情况下“不起作用”是什么意思):

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

编辑:

当然,这里不需要
左外部联接
,可能会在查询执行器上产生开销,因此最好使用
联接

EDIT2:

我想现在我有问题了。您需要使用
分组依据
而不是
订单依据

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

它给出了错误-ORA-00905:缺失keyword@mareckmareck:绝对不是。列(标识符)使用双引号引起来。单引号用于字符文字。它不是单引号,而是后引号。但实际上你是对的,在甲骨文中你使用了双引号。@mareckmareck:backtick和单引号一样错误。标准SQL(和Oracle)对标识符使用双引号。无效。如果login_log.loginDatime是lv,那么该列如何可能是lv.emp_代码。错误为ORA-00942:表或视图不可用exist@user3807573:对不起,我刚才复制了你的代码。忽略了你犯的错误。现在更正我已经这么做了,但它提供了所有登录时间,但我必须只选择每个用户的上次登录日期和时间,如我的问题中所述。@user3807573:请参阅我的编辑。我忽略了您获取最新登录信息的要求我已经这样做了,但它提供了所有登录时间,但我必须按照我的问题中所述,只选择每个用户的上次登录日期时间,所以您需要每个用户上次登录的日期时间?是的。实际上,在LOGIN_LOG表中有一条记录,记录每个用户每次登录的日期和时间。我得选最后一个。
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