Sql EXISTS如何返回除所有行或无行之外的内容?
我是一个开始SQL程序员-我得到了大多数东西,但不存在 在我看来,从文档来看,整个EXISTS语句返回一个布尔值 但是,我看到了一些具体的示例,其中可以使用它并返回表的一部分,而不是全部或全部Sql EXISTS如何返回除所有行或无行之外的内容?,sql,sql-server,Sql,Sql Server,我是一个开始SQL程序员-我得到了大多数东西,但不存在 在我看来,从文档来看,整个EXISTS语句返回一个布尔值 但是,我看到了一些具体的示例,其中可以使用它并返回表的一部分,而不是全部或全部 SELECT DISTINCT PNAME FROM P WHERE EXISTS ( SELECT * FROM SP Join S ON SP.SNO = S.SNO WHERE SP.PNO = P.PNO AND S.STATUS > 25 ) 此查
SELECT DISTINCT PNAME
FROM P
WHERE EXISTS
(
SELECT *
FROM SP Join S ON SP.SNO = S.SNO
WHERE SP.PNO = P.PNO
AND S.STATUS > 25
)
此查询向我返回一个值,即满足条件(S.Status>25)的值
但是,对于其他查询,如果EXISTS子查询中的一行为true,它似乎会返回我正在选择的整个表
如何控制这一点?主查询的where子句中的条件 从p中选择不同的PNAME 依赖于生存,, 如果子查询返回任何行, 然后exists返回true,否则返回false
主查询where子句返回p中的所有记录,如果存在,则返回true;如果返回false,则返回nothing您实际上创建了一个
相关子查询Exists
谓词接受子查询作为输入,如果子查询返回any行,则返回TRUE,否则返回FALSE
针对表p
的外部查询没有任何筛选器,因此将考虑EXISTS谓词返回TRUE的该表中的所有行
SELECT DISTINCT PNAME -- Outer Query
FROM P
现在,如果表p
中的当前行在SP.SNO=S.SNO上的SP Join S中有相关行,则EXISTS
谓词返回TRUE
,其中S.STATUS>25
SELECT *
FROM SP Join S ON SP.SNO = S.SNO
WHERE SP.PNO = P.PNO -- Inner query
AND S.STATUS > 25
使用EXISTS
谓词的好处之一是,它允许您直观地表达类似英语的查询。例如,此查询可以像您在普通英语中所说的那样阅读:从表P
中选择所有unique PNAME
,其中至少存在一行PNO
等于表SP中的PNO
,以及表S>25中的状态,提供的表SP
和S
基于SNO
子查询(如with EXISTS)进行连接,这些子查询可以是相关的,也可以是非相关的
在您的示例中,您使用了一个相关子查询,这通常是EXISTS的情况。在SP中查找给定P.PNO的记录,即查找每个P记录
如果没有SP.PNO=p.PNO
,您将有一个不相关的子查询。即子查询不再依赖于P记录。它将为任何P记录返回相同的结果(状态>25或根本不存在)。大多数情况下,这种情况是错误的(人们忘记了将子查询与相关记录关联),但有时需要这样做。您使用的是哪种SQL语言
要么EXISTS始终返回true或false,要么它始终返回行,但在WHERE EXISTS。。。它将检查返回的行是否大于0(=>true)
Oracle、MySQL、PostreSQL:
EXISTS条件与子查询结合使用,如果子查询返回至少一行,则视为“满足”。
()
您在Exists块中使用了P.PNO,这意味着您要对SP的每一行进行比较。如果删除此where条件,则它将返回所有数据,即使Exists包含一行,但它将返回true。Exists将评估下一个查询,如果它返回至少一条记录,则它将返回true,否则它将返回false,因此,这取决于您在exists关键字之后的查询,您可以发布使您困惑的其他查询,以解释它如何用于该特定查询。请发布返回整个表数据的其他查询。。