SQL查询查找不会在其他表中保留的记录

时间:2018-02-03 13:33:51

标签: sql database oracle oracle11g qsqlquery

我需要打印所有学生而非教师的人。我有三张桌子。 Oracle数据库。代码到目前为止:

// AlarmType alarm = new AlarmType();
while (rs.next()) {
    AlarmType alarm = new AlarmType(); // create new instance here
    alarm.setDeviceIndex(rs.getInt(1));
    /* ... */
    alarm.setAlarmTime(rs.getTimestamp(8));
    // alarmsTableView.getItems().add(alarm); // this shouldn't be necessary
    data.add(alarm);
    System.out.println(alarm.toString());
}
alarmsTableView.setItems(data);

我猜我的查询错误,因为它返回0结果。你知道我必须改变什么吗?

3 个答案:

答案 0 :(得分:2)

  

“我的查询错误,因为它返回0结果”

内部联接在匹配时返回记录。您正试图找到既不加入STUDENT也不加入TEACHER的PERSON记录。因此,更改查询以使用外连接:

SELECT PersonID, FirstName, LastName, Gender, DateOfBirth
FROM PERSON 
LEFT OUTER JOIN STUDENT S ON PERSON.PersonID = S.StudentID 
LEFT OUTER JOIN TEACHER T ON PERSON.PersonID = T.TeacherID
WHERE S.StudentID is null
AND  T.TeacherID is null;

这是一个反连接:它返回PERSON中与STUDENT和TEACHER中的记录不匹配的记录。

答案 1 :(得分:1)

使用not exists

select p.*
from person p
where not exists (select 1 from teacher t where t.teacherid = p.personid) and
      not exists (select 1 from students s where s.studentid = p.personid);

虽然您可以使用left join撰写此查询,但我认为使用not exists的版本几乎是问题的直接翻译,因此更容易理解。

在Oracle中,您也可以使用minus来编写 - 如果您只想要id:

select personid
from person
minus
select teacherid
from teacher
minus
select studentid
from student;

答案 2 :(得分:0)

- 使用Left Outer Join ...

尝试此操作
AppWidgetProvider