Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/71.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
SQL查询查找其他表中不存在的记录_Sql_Database_Oracle_Oracle11g_Qsqlquery - Fatal编程技术网

SQL查询查找其他表中不存在的记录

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 !=

我需要打印所有不是学生而不是教师的人。我有三张桌子。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 != 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认为正确的。哈哈,我是堆栈溢出中的第一个计时器…我在正确格式化它时遇到了问题。现在你知道如何格式化答案,你可以学习如何删除答案:)说真的,有很多问题没有任何答案,为什么不解决其中一些问题呢?重复的答案只会把线索弄得杂乱无章,对未来的搜索者来说没有什么用处。