7
votes

La différence entre "si existe" et "sinon existe" dans SQL?

Je suis très nouveau à SQL. Je veux savoir ce qui se passe lorsque j'utilise "s'il existe" ou "sinon existe". Pour Ex: Quelle est la différence entre les deux instructions suivantes:

Déclaration 1: (existe) xxx

déclaration 2: (N'existe pas) xxx

Quel sera le si existez ou sinon retourner? Quel est le meilleur parmi ces deux? Quand utiliser si existe et quand utiliser s'il n'existe pas


0 commentaires

7 Réponses :


2
votes

si existez vérifie que le jeu de résultats n'est pas vide et s'il n'existe pas vérifie que le jeu de résultats est vide.

qui vaut mieux parmi ces deux?

Celui qui vous donne la sémantique appropriée.

Quand utiliser "si existe" et quand utiliser "si ce n'est pas existant"

Lorsque vous devez vérifier le non-vide ou le vide d'un ensemble de résultats.


1 commentaires

Mate, je ne comprends pas la phrase "..... vérifie que le jeu de résultats n'est pas vide si vide ....."



2
votes

Vous avez besoin de la première déclaration. Fondamentalement "s'il existe" renvoie true si la requête renvoie 1 lignes ou plus, donc dans votre exemple, il retournera une seule ligne (contenant un champ avec valeur 1) afin d'exécuter l'instruction DELETE comme vous le souhaitez.


1 commentaires

Le second serait plus approprié si vous vouliez insérer quelque chose si ce n'était pas là. Par exemple. S'il n'existe pas (sélectionnez 1 à partir de dbo.order_details dans laquelle ordre_id = 11032) commence à insérer dans dbo.order_details (... certaines valeurs) fin



1
votes

Ceci est certainement un moyen d'utiliser un Existe . Je ne suis pas sûr que le second ferait quoi que ce soit.

Cependant, vous pouvez simplement xxx

et supprimer le exister tout à fait, sauf si vous vouliez exécuter xxx

ou votre code réel était plus complexe que ce qui est montré.

Votre deuxième instruction ne supprimera jamais quoi que ce soit, si sont lignes, il évaluera à false et n'effectuera pas le Supprimer et s'il n'y a pas ne sont pas des lignes , il va évaluer à true et exécuter le Supprimer qui ne fera rien puisqu'il n'y a pas de lignes.

en ce qui concerne la performance, dans le contexte dans lequel vous utilisez. Le existe Ni l'un ni l'un ni l'autre n'a une meilleure performance car il est vraiment juste d'évaluer si le résultat défini à partir du Sélectionnez est null ou non.

Il existe une autre utilisation de Exist dans lequel n'existe pas est beaucoup moins efficace que existe et peut être effez remplacé ctelly avec une phrase performante. Je fais référence lorsque vous utilisez n'existe pas dans le clause d'une déclaration. Dans cette cause, vous feriez mieux d'effectuer une jointure (au lieu de la jointure intérieure vous avez probablement) et de filtrer où la carte droite.Somecolumn est null .


2 commentaires

Mate, j'essaie d'optimiser une procédure stockée afin que je dois utiliser la condition "si elle existe" ou "s'il n'existe pas", avant de supprimer l'enregistrement.


Pourquoi l'optimisation-t-elle nécessiterait-elle l'utilisation d'un exister ? L'optimisation consiste à réduire la complexité globale et le code que vous indiquez augmente la charge de travail sans cause. À moins que, bien sûr, votre code actuel est plus complexe.



2
votes

Les deux déclarations rendront un résultat booléen vrai / faux.

existe renvoie true si le jeu de résultats n'est pas vide.

n'existe pas est une opération annulée, elle revient donc true si le jeu de résultats est vide


3 commentaires

@Carolene: lequel a la bonne sémantique est ce qui compte avant tout.


Les performances qu'ils vont être similaires, si quelque chose n'existe pas pourrait être légèrement plus lent, car elle nie le résultat d'existence.


"Si quelque chose n'existe pas pourrait être légèrement plus lent, car il nie le résultat d'exists" - je pense que le contraire est le cas. existe tous les deux et n'existe pas peut courte Citcuit. Le nom de l'élément de données order_id suggère une bonne sélectivité et n'existe pas évaluera faux (court-circuit) dès qu'une valeur est trouvée qui ne correspond pas à une valeur qui ne correspond pas La condition de recherche ordre_id = 11032 , susceptible d'être la première valeur qu'elle rencontre. existe ne renvoie pas vrai (court-circuit) jusqu'à ce qu'une valeur soit trouvée pour correspondre à la condition de recherche, ce qui pourrait impliquer de rechercher de nombreuses commandes, de nombreuses commandes avant de se trouver.



1
votes

"existe simplement teste si la requête interne retourne n'importe quelle ligne. Si tel est le cas, la requête extérieure se déroule. Sinon, la requête extérieure n'exécute pas et que toute la déclaration SQL ne renvoie rien." Voir ici . Il n'existe pas que la négation existe bien sûr.

Qu'est-ce que la première déclaration est que cela émettra une requête de suppression si la commande peut être trouvée. La seconde n'a aucun sens car elle émettra la requête sur la commande lorsqu'elle n'existe pas.


0 commentaires

2
votes

S'il y a ordre_details avec un ordre_id égal à 11032, votre première instruction exécutera: xxx

s'il n'y a pas de commande_details avec un ordre_id égal à 11032, votre deuxième instruction sera exécutée. Notez qu'il s'agit d'un ensemble vide depuis que vous venez de vérifier qu'il n'y avait pas de commandes avec cette commande_id.

Il va réellement être plus facile, dans cet exemple, d'exécuter la suppression - le cas échéant et sinon Existe existe superflu.


0 commentaires

3
votes

Voici 4 exemples illustrant quand vous utiliseriez si vous n'existeriez pas et lorsque vous n'utilisez pas s'il n'existe pas:

a) Supprimer des enregistrements associés de plus de 1 table: p>

IF EXISTS (SELECT TOP(1) 1 FROM Table1 WHERE ORDER_ID = 11032) BEGIN
    UPDATE Table1 SET Field1='X' WHERE ORDER_ID = 11032
    -- possibly more statements following here ...
END
ELSE BEGIN
    INSERT INTO Table1(Field1, Field2, ORDER_ID) VALUES ('X', 'B', 11032)
    -- possibly more statements following here ...
END


0 commentaires