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 :

[SQL SERVER 2008]Pourquoi cette requete marche ? xD


Sujet :

Développement SQL Server

  1. #1
    Membre habitué
    Profil pro
    Inscrit en
    Avril 2006
    Messages
    205
    Détails du profil
    Informations personnelles :
    Localisation : Canada

    Informations forums :
    Inscription : Avril 2006
    Messages : 205
    Points : 125
    Points
    125
    Par défaut [SQL SERVER 2008]Pourquoi cette requete marche ? xD
    Bonjour,

    Je suis sous MS SQL SERVER 2008 et je fais cette requete

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    SELECT PRG_ID FROM PRG_HC WHERE PRG_ID IN (SELECT PRG_ID FROM T_ARBO_PRG WHERE HC_ID=2)
    et ca me donne le bon résultat ...
    PRG_HC possède HC_ID et PRG_ID qui sont PRIMARY KEY
    T_ARBO_PRG possède PRG_ID PRIMARY KEY

    (SELECT PRG_ID FROM T_ARBO_PRG WHERE HC_ID=2)

    Comment fait il le lien ? j'ai pas fait de JOIN...

    Fait t-il une liaison implicite ?

  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
    Points : 13 092
    Points
    13 092
    Par défaut
    Bonjour,

    Ça marche ? alors surtout, ne touchez plus à rien !

    Découpons votre requete en deux, en commençant par la requete dans la IN :

    1/ Vous récupérez dans la table T_ARBO_PRG, les PRG_ID pour toutes les lignes où HC_ID = 2

    2/ Ensuite, vous récupérez dans la table PRG_HC les PRG_ID qui sont contenu dans le résultat de votre sous requete (IN)


    La requete globale vous renvoi donc littéralement :
    tous les PRG_ID présents dans la table PRG_HC, et qui sont également présents dans la table T_ARBO_PRG avec au moins un ligne par PRG_ID où HC_ID = 2

    Je ne sais pas si j'ai été clair !

    (c'est déjà pas toujours facile d'expliquer pourquoi ça ne fonctionne pas, alors expliquer pourquoi ca fonctionne... )


    Cela dit, il serait en effet mieux de faire une jointure entre vos deux tables, et vous devriez obtenir le même résultat...

  3. #3
    Membre habitué
    Profil pro
    Inscrit en
    Avril 2006
    Messages
    205
    Détails du profil
    Informations personnelles :
    Localisation : Canada

    Informations forums :
    Inscription : Avril 2006
    Messages : 205
    Points : 125
    Points
    125
    Par défaut
    le problème c'est que

    1/ Vous récupérez dans la table T_ARBO_PRG, les PRG_ID pour toutes les lignes où HC_ID = 2
    dans T_ARBO_PRG il n'y a pas de HC_ID
    Mais elle est dans PRG_HC...

  4. #4
    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
    Points : 13 092
    Points
    13 092
    Par défaut
    Citation Envoyé par lerieure Voir le message
    le problème c'est que

    dans T_ARBO_PRG il n'y a pas de HC_ID
    Mais elle est dans PRG_HC...
    Je n'avais pas vu cette subtilité dans votre description...
    Et j'avais donc mal compris le sens de votre question

    Donc :
    La réponse est oui, bien que je ne sais pas si on peut vraiment parler de "liaison implicite"
    Telle que votre requete est écrite, c'est la valeur de la colonne HC_ID de la table PRG_HC qui est évaluée.
    Votre filtre est évalué pour chaque ligne de la table PRG_HC, et donc chaque colonne de cette table peut prendre place dans votre filtre.

    Cette requete (bien que particulièrement absurde) fonctionnerait aussi d'ailleurs :
    Code sql : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    SELECT 
        PRG_ID 
    FROM PRG_HC 
    WHERE PRG_ID IN (
        SELECT HC_ID 
        FROM T_ARBO_PRG 
    )

    Elle vous renverrait toutes les lignes de PRG_HC où PRG_ID = HC_ID (pour peu que T_ARBO_PRG contienne au moins une ligne)

    Car au moment de l'évaluation du filtre, HC_ID a bien une valeur, celle colonne HC_ID de la ligne pour laquelle le filtre est évalué.

    Bien sur, dans votre requete initiale, si T_ARBO_PRG avait eut une colonne HC_ID, c'est la colonne de cette table qui aurait été prise en compte dans le filtre de la sous requete...

    D'autres exemples de requêtes pour mieux comprendre le mécanisme (une courte requete vaut mieux qu'un long discours..)

    Code sql : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    SELECT 
        PRG_ID 
    FROM PRG_HC 
    WHERE PRG_ID IN (
        SELECT HC_ID 
    )
    équivalent à
    Code sql : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    SELECT 
        PRG_ID 
    FROM PRG_HC 
    WHERE PRG_ID IN (HC_ID)

    équivalent à (sur la logique de la requete tout du moins)
    Code sql : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    SELECT 
        PRG_ID 
    FROM PRG_HC 
    WHERE PRG_ID = HC_ID


    Donc votre requete initiale est équivalente à :
    Code sql : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    SELECT 
        PRG_ID 
    FROM PRG_HC 
    WHERE PRG_ID IN (SELECT PRG_ID FROM T_ARBO_PRG )
    AND HC_ID=2

  5. #5
    Modérateur
    Avatar de sevyc64
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Janvier 2007
    Messages
    10 192
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 51
    Localisation : France, Pyrénées Atlantiques (Aquitaine)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Janvier 2007
    Messages : 10 192
    Points : 28 073
    Points
    28 073
    Par défaut
    Citation Envoyé par lerieure Voir le message
    le problème c'est que



    dans T_ARBO_PRG il n'y a pas de HC_ID
    Mais elle est dans PRG_HC...
    Dans ce cas, la requete ne devrait pas marcher.

    Essaye d'exécuter la requete du IN toute seule pour voir.
    --- Sevyc64 ---

    Parce que le partage est notre force, la connaissance sera notre victoire

  6. #6
    Membre habitué
    Profil pro
    Inscrit en
    Avril 2006
    Messages
    205
    Détails du profil
    Informations personnelles :
    Localisation : Canada

    Informations forums :
    Inscription : Avril 2006
    Messages : 205
    Points : 125
    Points
    125
    Par défaut
    Marche pas toute seule

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. SQL SERVER 2008 -> Champ XML -> Requete sur tout le texte
    Par dacid dans le forum Développement
    Réponses: 3
    Dernier message: 14/09/2012, 15h51
  2. Excecution de requetes sur SQL server 2008 express
    Par Aizen64 dans le forum Outils
    Réponses: 4
    Dernier message: 14/04/2011, 18h02
  3. Réponses: 2
    Dernier message: 06/02/2011, 03h05
  4. [SQL SERVER 2008] Passer une variable à un requete.
    Par lerieure dans le forum MS SQL Server
    Réponses: 4
    Dernier message: 19/01/2011, 22h24
  5. [SQL Server 2008] Requete stockée dans la base de données
    Par hwoarang dans le forum Développement
    Réponses: 3
    Dernier message: 30/09/2010, 14h42

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