我是一个开始SQL程序员 – 我得到了大多数东西,但不是EXISTS.
它在我看来,并通过文档查看整个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 )
此查询返回一个值,即满足条件的值(S.Status> 25).
但是,对于其他查询,如果EXISTS子查询中的一行甚至是真的,它似乎返回我正在选择的整个表.
如何控制这个?
解决方法
诸如EXISTS的子查询可以是相关的,也可以是非相关的.
在您的示例中,您使用相关子查询,这通常是EXISTS的情况.您在SP中查找给定P.PNO的记录,即您对每个P记录进行查找.
如果没有SP.PNO = P.PNO,您将拥有一个不相关的子查询.即子查询不再依赖于P记录.它会为任何P记录返回相同的结果(状态> 25根本不存在).大多数情况下,当发生这种情况时,这是错误地完成的(一个忘记将子查询与所讨论的记录联系起来),但有时也是如此.