Comment fonctionne la clause EXISTS dans SQL Server?

J'ai essayé avec des requêtes ci-dessous et peu confus au sujet du fonctionnement de la clause EXISTS , bien que je sache qu'elle évalue TRUE/FALSE .

La sous-requête SQL n ° 1 ci-dessous renvoie de toute façon 0, mais le résultat de la requête combinée est toujours 1.

 1. SELECT 1 WHERE EXISTS ( SELECT 0 WHERE 1 = 1 ) 2. SELECT 1 WHERE EXISTS ( SELECT 0 WHERE 1 = 0 ) 

En outre, si la clause EXISTS évalue TRUE/FALSE , alors pourquoi le paramètre ci-dessous ne fonctionne-t-il pas?

 SELECT 1 WHERE EXISTS ( 1 ) 

S'il vous plaît, aidez-moi à comprendre cette situation.

EDIT: La clause EXISTS évaluée sur TRUE/FALSE . La condition est TRUE si une sous-requête renvoie un résultat. Alors pourquoi EXISTS ( 1 ) ne fonctionne pas? C'est une condition TRUE .

De la documentation EXISTS :

Spécifie une sous-requête à tester pour l'existence de lignes.

 SELECT 1 WHERE EXISTS ( SELECT 0 WHERE 1 = 1 ) -- there is row SELECT 1 WHERE EXISTS ( SELECT 0 WHERE 1 = 0 ) -- no row returned by subquery SELECT 1 WHERE EXISTS ( 1 ) -- not even valid query `1` is not subquery 

Gardez à l'esprit qu'il vérifie les lignes et non les valeurs:

 SELECT 1 WHERE EXISTS ( SELECT NULL WHERE 1 = 1 ) -- will return 1 

LiveDemo

MODIFIER:

Cela semble contradictoire avec la phrase "EXISTS clause evalue for TRUE / FALSE"?

EXISTS opérateur EXISTS teste l'existence de lignes et renvoie TRUE/FALSE .

Donc, si la sous-requête returnne:

 ╔══════════╗ ╔══════════╗ ╔══════════╗ ╔══════════╗ ║ subquery ║ ║ subquery ║ ║ subquery ║ ║ subquery ║ ╠══════════╣ ╠══════════╣ ╠══════════╣ ╠══════════╣ ║ NULL ║ ║ 1 ║ ║ 0 ║ ║anything ║ ╚══════════╝ ╚══════════╝ ╚══════════╝ ╚══════════╝ 

Alors EXISTS (subquery) -> TRUE .

Si la sous-requête renvoie (pas de ligne):

 ╔══════════╗ ║ subquery ║ ╚══════════╝ 

Alors EXISTS (subquery) -> FALSE .

EXISTS renvoie true lorsque la sous-requête à l'intérieur de celle-ci contient des lignes. Une manière logiquement équivalente (mais non recommandée) de réécrire une expression EXISTS est:

 SELECT 1 WHERE (SELECT COUNT(*) FROM (SELECT 0 WHERE 1 = 1)) > 0 

Dans cette réécriture, votre dernière requête ressemble à:

 SELECT 1 WHERE (SELECT COUNT(*) FROM 1) > 0 

que vous devriez voir n'a pas de sens.

Comportement:

 Condition Is true if ... ---------- ------------------ EXISTS the subquery returns at least one row NOT EXISTS the subquery returns no data 

Usage:

 WHERE EXISTS ( subquery ); WHERE NOT EXISTS ( subquery );