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:
Quel sera le si existez code> ou sinon code> retourner?
Quel est le meilleur parmi ces deux?
Quand utiliser si existe code> et quand utiliser s'il n'existe pas code> p> p> p>
7 Réponses :
qui vaut mieux parmi ces deux? p>
blockQuote>
Celui qui vous donne la sémantique appropriée. P>
Quand utiliser "si existe" et quand utiliser "si ce n'est pas existant" p>
blockQuote>
Lorsque vous devez vérifier le non-vide ou le vide d'un ensemble de résultats. P> si existez code> vérifie que le jeu de résultats n'est pas fort> vide et s'il n'existe pas code> vérifie que le jeu de résultats est fort> vide. p>
Mate, je ne comprends pas la phrase "..... vérifie que le jeu de résultats n'est pas vide si vide ....."
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. P>
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
Ceci est certainement un moyen d'utiliser un Cependant, vous pouvez simplement p> et supprimer le ou votre code réel était plus complexe que ce qui est montré. p> Votre deuxième instruction ne supprimera jamais quoi que ce soit, si sont forts> lignes, il évaluera à en ce qui concerne la performance, dans le contexte dans lequel vous utilisez. Le Il existe une autre utilisation de Existe code>. Je ne suis pas sûr que le second ferait quoi que ce soit. exister code> tout à fait, sauf si vous vouliez exécuter p> false code> et n'effectuera pas le Supprimer code> et s'il n'y a pas strong> ne sont pas des lignes fortes>, il va évaluer à true code> et exécuter le Supprimer code> qui ne fera rien puisqu'il n'y a pas de lignes. p> existe code> 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 code> est null code> ou non. P> Exist code> dans lequel n'existe pas code> est existe code> et peut être effez remplacé ctelly avec une phrase performante. Je fais référence lorsque vous utilisez n'existe pas code> dans le où code> clause d'une déclaration. Dans cette cause, vous feriez mieux d'effectuer une jointure code> code> (au lieu de la jointure intérieure code> vous avez probablement) et de filtrer où la carte droite.Somecolumn est null code >. p> p>
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 code>? 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.
Les deux déclarations rendront un résultat booléen vrai / faux. P>
existe code> renvoie true si le jeu de résultats n'est pas vide. P>
n'existe pas code> est une opération annulée, elle revient donc true si le jeu de résultats est vide p>
@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 code> et n'existe pas code> peut courte Citcuit. Le nom de l'élément de données order_id code> suggère une bonne sélectivité et n'existe pas code> évaluera faux code> (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 code>, susceptible d'être la première valeur qu'elle rencontre. existe code> 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.
"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. P>
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. P>
S'il y a ordre_details avec un ordre_id égal à 11032, votre première instruction exécutera: 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. P> Il va réellement être plus facile, dans cet exemple, d'exécuter la suppression - le cas échéant et sinon Existe existe superflu. P> p>
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