将“人员”表,“登录”表和“数据”表组合在一起,以获取具有数据的最新登录日期的人员

时间:2015-02-24 22:42:11

标签: sql join timestamp greatest-n-per-group

我有三张桌子:

Table 1: PERSON  
  personName varchar2 unique 
  personGender varchar2 
  personAge int

Table 2: LOGGED_ON_LOG  
  id int unique  
  personName varchar2  
  loggedOn timestamp  

Table 3: DATA  
  id int unique  
  personName varchar2  
  dataContent varchar2 

我一直在尝试编写一个连接语句,以便在上次登录时检索DATA表中包含数据的所有人的结果。
我知道我能做到:

SELECT loggedOn FROM LOGGED_ON_LOG WHERE loggedOn IN (SELECT max(loggedOn)     as loggedOn FROM LOGGED_ON_LOG WHERE personName='John Doe'); 

获取用户上次登录的时间。

我能做到:

SELECT personName, personGender, personAge FROM PERSON WHERE personName IN (SELECT DISTINCT personName FROM DATA);

让所有拥有数据的人。

如何加入这两个选项以便得到以下结果: personName,personGender,personAge,loggedOn

1 个答案:

答案 0 :(得分:0)

你可能没有得到回应,因为没有那么多人使用过apache derby但是如果不一定优化的话,这应该适用于大多数dbmses:

SELECT p.personName, p.personGender, p.personAge, Max( loggedOn)
  FROM PERSON p, Logged_on_log l
 WHERE p.personName = l.personName
   AND exists (SELECT 1 FROM DATA d where d.person_name = p.person_name)
GROUP BY p.personName, p.personGender, p.personAge

如果由于某种原因德比不支持分组,你可以添加你的子查询:

 AND loggedOn = (
  SELECT max(loggedOn) FROM LOGGED_ON_LOG l2 
  WHERE p.personName = l2.person_name)