组合 "person" table、"logged on" table 和 "data" table 以获得具有数据的最新登录日期的人

Combine "person" table, "logged on" table and "data" table to get person with latest logged on date that has data

我有三个 table:

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 table 中有数据的人最后一次登录的结果。
我知道我能做到:

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

您可能没有得到回应,因为没有多少人使用过 apache derby,但如果不一定优化,这应该适用于大多数 dbms:

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

如果由于某种原因 derby 不支持分组依据,您可以添加子查询:

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