我需要打印所有不学生而非教师的人。我有三张桌子。 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结果。你知道我必须改变什么吗?
答案 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