IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Développement SQL Server Discussion :

IF EXISTS select 1 et IF EXIST SELECT null


Sujet :

Développement SQL Server

  1. #1
    Membre éclairé
    Homme Profil pro
    test
    Inscrit en
    Mai 2016
    Messages
    346
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : Algérie

    Informations professionnelles :
    Activité : test
    Secteur : Boutique - Magasin

    Informations forums :
    Inscription : Mai 2016
    Messages : 346
    Par défaut IF EXISTS select 1 et IF EXIST SELECT null
    bonjour

    Sur plusieurs type du requêtes utilisé dans mon programme j'ai besoin de tester l’existante des éléments a travers la commande IF EXISTSs

    pour cela je cherche la différence entre ces deux partie de transact
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    IF EXISTS(Select null from table)
    et
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    IF EXISTS(Select 1 from table)
    quel la différence entre les deux ?et Quel est le plus performant entre les deux

    merci pour vos aide et explication

  2. #2
    Modérateur

    Profil pro
    dba
    Inscrit en
    Janvier 2010
    Messages
    5 643
    Détails du profil
    Informations personnelles :
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : dba

    Informations forums :
    Inscription : Janvier 2010
    Messages : 5 643
    Par défaut
    Bonjour,

    Il n'y a aucune différence entre les deux (et donc aucune différence de performance)

    par nature, EXISTS teste l’existence de ligne, le contenu du SELECT n'importe donc pas.

  3. #3
    Rédacteur

    Avatar de SQLpro
    Homme Profil pro
    Expert bases de données / SQL / MS SQL Server / Postgresql
    Inscrit en
    Mai 2002
    Messages
    21 986
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Expert bases de données / SQL / MS SQL Server / Postgresql
    Secteur : Conseil

    Informations forums :
    Inscription : Mai 2002
    Messages : 21 986
    Billets dans le blog
    6
    Par défaut
    Citation Envoyé par aieeeuuuuu Voir le message
    Bonjour,

    Il n'y a aucune différence entre les deux (et donc aucune différence de performance)

    par nature, EXISTS teste l’existence de ligne, le contenu du SELECT n'importe donc pas.
    Et même SELECT * est parfait dans ce cas !!!!!!!
    Y compris s'il y a un groupage parce qu'il se fout totalement du contenu de la clause SELECT !!!!!!!

    A +
    Frédéric Brouard - SQLpro - ARCHITECTE DE DONNÉES - expert SGBDR et langage SQL
    Le site sur les SGBD relationnels et le langage SQL: http://sqlpro.developpez.com/
    Blog SQL, SQL Server, SGBDR : http://blog.developpez.com/sqlpro
    Expert Microsoft SQL Server - M.V.P. (Most valuable Professional) MS Corp.
    Entreprise SQL SPOT : modélisation, conseils, audit, optimisation, formation...
    * * * * * Expertise SQL Server : http://mssqlserver.fr/ * * * * *

  4. #4
    Expert confirmé
    Avatar de StringBuilder
    Homme Profil pro
    Chef de projets
    Inscrit en
    Février 2010
    Messages
    4 197
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Chef de projets
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Février 2010
    Messages : 4 197
    Billets dans le blog
    1
    Par défaut
    Un bémol cependant avec le * : si on crée un objet lié au schéma, SQL Server est un peu con dans sa tête, et refuse le * (alors qu'il n'a aucune raison de le prendre en compte dans ce cas précis, pas plus que dans un COUNT(*) d'ailleurs) mais c'est comme ça, le gars qui a écrit le compilateur T-SQL était certainement une grosse faignasse et n'a fait le boulot qu'à moitié (testé avec SQL Server 2014 Express)

    (mode troll des plages qui revient avec la serviette autour de la taille).

  5. #5
    Rédacteur

    Avatar de SQLpro
    Homme Profil pro
    Expert bases de données / SQL / MS SQL Server / Postgresql
    Inscrit en
    Mai 2002
    Messages
    21 986
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Expert bases de données / SQL / MS SQL Server / Postgresql
    Secteur : Conseil

    Informations forums :
    Inscription : Mai 2002
    Messages : 21 986
    Billets dans le blog
    6
    Par défaut
    Citation Envoyé par StringBuilder Voir le message
    Un bémol cependant avec le * : si on crée un objet lié au schéma, SQL Server est un peu con dans sa tête, et refuse le * (alors qu'il n'a aucune raison de le prendre en compte dans ce cas précis, pas plus que dans un COUNT(*) d'ailleurs) mais c'est comme ça, le gars qui a écrit le compilateur T-SQL était certainement une grosse faignasse et n'a fait le boulot qu'à moitié (testé avec SQL Server 2014 Express)

    (mode troll des plages qui revient avec la serviette autour de la taille).
    Désolé de te contredire, mais il était parfaitement logique et respectueux de la norme !
    En effet, la norme SQL précise qu'en cas d'utilisation de * dans le SELECT pour une vue, la vue doit être stable et en particulier ne pas avoir deux colonnes portant le même nom...
    Or en laissant * dans le SELECT on peut se retrouver à terme avec deux fois le même nom auquel cas la vue ne marche plus ce qui serait contradictoire avec la stabilité attendue par le SCHEMABINDING !

    A +
    Frédéric Brouard - SQLpro - ARCHITECTE DE DONNÉES - expert SGBDR et langage SQL
    Le site sur les SGBD relationnels et le langage SQL: http://sqlpro.developpez.com/
    Blog SQL, SQL Server, SGBDR : http://blog.developpez.com/sqlpro
    Expert Microsoft SQL Server - M.V.P. (Most valuable Professional) MS Corp.
    Entreprise SQL SPOT : modélisation, conseils, audit, optimisation, formation...
    * * * * * Expertise SQL Server : http://mssqlserver.fr/ * * * * *

  6. #6
    Expert confirmé
    Avatar de StringBuilder
    Homme Profil pro
    Chef de projets
    Inscrit en
    Février 2010
    Messages
    4 197
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Chef de projets
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Février 2010
    Messages : 4 197
    Billets dans le blog
    1
    Par défaut
    Citation Envoyé par SQLpro Voir le message
    Or en laissant * dans le SELECT on peut se retrouver à terme avec deux fois le même nom auquel cas la vue ne marche plus ce qui serait contradictoire avec la stabilité attendue par le SCHEMABINDING !
    Justement, pas dans le cas où le * se situe dans un "EXISTS" au sein de la vue :

    Code sql : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
    create view v_a_existant_dans_b (id, nom)
    with schemabinding
    select a.id, a.nom
    from tableA a
    where exists (
       select *
       from tableB b
       where b.id = a.id
    )
    => Ne compilera pas si on lie la vue au schéma.

    Pourtant :
    Code sql : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
    create view v_a_existant_dans_b (id, nom)
    with schemabinding
    select a.id, a.nom
    from tableA a
    where exists (
       select 'j''aime les nouilles pas toi ?'
       from tableB b
       where b.id = a.id
    )
    Compile tout à fait.

    Tout autant que :
    Code sql : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
    create view v_a_existant_dans_b (id, nom)
    with schemabinding
    select a.id, a.nom
    from tableA a
    where exists (
       select b.id, b.id, b.nom, b.nom
       from tableB b
       where b.id = a.id
    )
    => Alors qu'il y a des colonnes de même nom dans le sous-select

    En fait, quel que soit le nombre de colonnes dans B (qui ne peuvent de toute façon pas être synonymes), le lien avec le schéma ne peut en aucun cas être remis en question en cas d'évolution de la table "tableB".
    J'estime que dans ce cas, même si ça peut te paraître moche, le "*" pourrait parfaitement être toléré avec un SCHEMABINDING, car quelles que soient les évolutions de la structures des objets impliqués dans la vue, en aucun cas le "*" ne peut remettre en question la stabilité de la vue.

  7. #7
    Modérateur
    Avatar de escartefigue
    Homme Profil pro
    bourreau
    Inscrit en
    Mars 2010
    Messages
    10 543
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Loir et Cher (Centre)

    Informations professionnelles :
    Activité : bourreau
    Secteur : Finance

    Informations forums :
    Inscription : Mars 2010
    Messages : 10 543
    Billets dans le blog
    10
    Par défaut
    Faites comme moi, proscrivez le select * que ce soit dans un test d'existence ou ailleurs c'est tellement mieux ainsi

  8. #8
    Modérateur

    Homme Profil pro
    Administrateur de base de données
    Inscrit en
    Janvier 2005
    Messages
    5 826
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Administrateur de base de données
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Janvier 2005
    Messages : 5 826
    Par défaut
    Citation Envoyé par StringBuilder
    le gars qui a écrit le compilateur T-SQL était certainement une grosse faignasse et n'a fait le boulot qu'à moitié
    Autant je comprends que le test d'existence dans la définition d'une vue liée au schéma par une étoile vous déçoive, autant votre remarque est assez démesurée

    Je doute qu'écrire un compilateur soit simple, tout autant du fait qu'il n'y ait qu'une seule personne qui ait participé à l'implémentation
    Il suffit pour cela de penser aux cas à vérifier pour s'assurer que la vue peut être liée au schéma.
    Dans l'exemple que vous donnez avec la constante de type chaîne, effectivement c'est choquant, mais du point de vue du compilateur, c'est une constante (au sens invariable du terme ).

    @++

  9. #9
    Expert confirmé
    Avatar de StringBuilder
    Homme Profil pro
    Chef de projets
    Inscrit en
    Février 2010
    Messages
    4 197
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Chef de projets
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Février 2010
    Messages : 4 197
    Billets dans le blog
    1
    Par défaut
    D'où ma phrase :
    (mode troll des plages qui revient avec la serviette autour de la taille).
    Evidement, j'imagine bien que c'est pas si simple, d'autant qu'il n'y a aucun intérêt fonctionnel à faire une exception du * dans un EXISTS.

Discussions similaires

  1. Vérifier l'existence de mes enregistrements par un SELECT
    Par boutmos dans le forum Langage SQL
    Réponses: 6
    Dernier message: 17/09/2010, 23h17
  2. Select et if not exists
    Par Zyxon dans le forum Requêtes
    Réponses: 2
    Dernier message: 03/09/2009, 09h17
  3. [AC-2003] Vérifier l'existence d'un enregistrement : DLookUp ou Select
    Par buzz73 dans le forum IHM
    Réponses: 2
    Dernier message: 22/07/2009, 13h31
  4. Réponses: 5
    Dernier message: 14/08/2007, 11h31
  5. Select avec in ou exists
    Par eowene dans le forum Requêtes
    Réponses: 14
    Dernier message: 18/01/2007, 17h22

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo