EXISTS如何返回除所有行或没有行之外的其他内容?

Kin*_*ede 6 sql sql-server

我是一个开始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
)
Run Code Online (Sandbox Code Playgroud)

此查询返回一个值,即符合条件的值(S.Status> 25).

但是,对于其他查询,如果EXISTS子查询中的一行甚至是真的,它似乎返回我正在选择的整个表.

如何控制这个?

Tho*_*ner 3

子查询(例如 EXISTS)可以是相关的,也可以是不相关的。

在您的示例中,您使用相关子查询,这通常是 EXISTS 的情况。您在 SP 中查找给定 P.PNO 的记录,即对每个 P 记录进行查找。

如果没有,SP.PNO = P.PNO您将拥有一个不相关的子查询。即子查询不再依赖于P记录。对于任何 P 记录,它都会返回相同的结果(状态 > 25 存在或不存在)。大多数情况下,当发生这种情况时,这是错误地完成的(忘记将子查询与相关记录相关联),但有时这是需要的。