SQL查询查找其他表中不存在的记录
我需要打印所有不是学生而不是教师的人。我有三张桌子。Oracle数据库。迄今为止的代码:SQL查询查找其他表中不存在的记录,sql,database,oracle,oracle11g,qsqlquery,Sql,Database,Oracle,Oracle11g,Qsqlquery,我需要打印所有不是学生而不是教师的人。我有三张桌子。Oracle数据库。迄今为止的代码: SELECT PersonID, FirstName, LastName, Gender, DateOfBirth FROM PERSON INNER JOIN STUDENT S ON PERSON.PersonID = S.StudentID INNER JOIN TEACHER T ON PERSON.PersonID = T.TeacherID WHERE PERSON.PersonID !=
SELECT PersonID, FirstName, LastName, Gender, DateOfBirth
FROM PERSON
INNER JOIN STUDENT S ON PERSON.PersonID = S.StudentID
INNER JOIN TEACHER T ON PERSON.PersonID = T.TeacherID
WHERE PERSON.PersonID != S.StudentID
AND PERSON.PersonID != T.TeacherID;
我猜我的查询是错误的,因为它返回0个结果。你知道我必须更改什么吗?使用
不存在:
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中,您还可以使用减号——如果您只需要id:
select personid
from person
minus
select teacherid
from teacher
minus
select studentid
from student;
使用不存在
:
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中,您还可以使用减号——如果您只需要id:
select personid
from person
minus
select teacherid
from teacher
minus
select studentid
from student;
“我的查询错误,因为它返回0个结果”
当存在匹配项时,内部连接返回记录。您正在尝试查找既不与学生也不与教师关联的个人记录。因此,将查询更改为使用外部联接:
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;
这是一个反连接:它返回的记录与学生和教师中的记录不匹配
“我的查询错误,因为它返回0个结果”
当存在匹配项时,内部连接返回记录。您正在尝试查找既不与学生也不与教师关联的个人记录。因此,将查询更改为使用外部联接:
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;
这是一个反联接:它返回的记录与学生和教师中的记录不匹配。--使用左外部联接尝试此操作
SELECT
P.PersonID,
P.FirstName,
P.LastName,
P.Gender,
P.DateOfBirth
FROM PERSON P
LEFT OUTER JOIN STUDENT S ON P.PersonID = S.StudentID
LEFT OUTER JOIN TEACHER T ON P.PersonID = T.TeacherID
WHERE S.PersonID is null and T.PersonID is null
--用左外连接试试这个
SELECT
P.PersonID,
P.FirstName,
P.LastName,
P.Gender,
P.DateOfBirth
FROM PERSON P
LEFT OUTER JOIN STUDENT S ON P.PersonID = S.StudentID
LEFT OUTER JOIN TEACHER T ON P.PersonID = T.TeacherID
WHERE S.PersonID is null and T.PersonID is null
1代表什么?@TeodorKolev<代码>存在
和不存在
仅检查是否返回了行,而不是列的内容1
是定义列的最简单方法。我给出了两个答案,但@APC answer似乎更合适(只有一个选择)1代表什么?@TeodorKolev<代码>存在
和不存在
仅检查是否返回了行,而不是列的内容1
是定义列的最简单方法。我给出了两个答案,但@APC answer似乎更合适(只需选择一个选项)ORA-00933:SQL命令未正确结束00933。00000-“SQL命令未正确结束”ORA-00933:SQL命令未正确结束00933。00000-“SQL命令未正确结束”这似乎与我半小时前发布的答案非常相似,OP已接受为正确答案。哈哈,我是堆栈溢出的第一个计时器…我在正确格式化它时遇到问题。现在你知道如何格式化答案了,你可以学习如何删除答案:)认真地说,有很多问题没有答案,为什么不解决其中一些呢?重复的答案只会把线索弄得杂乱无章,对未来的搜索者来说不太有用。这似乎与我半小时前发布的答案非常相似,这是OP认为正确的。哈哈,我是堆栈溢出中的第一个计时器…我在正确格式化它时遇到了问题。现在你知道如何格式化答案,你可以学习如何删除答案:)说真的,有很多问题没有任何答案,为什么不解决其中一些问题呢?重复的答案只会把线索弄得杂乱无章,对未来的搜索者来说没有什么用处。