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 :

Question sur le livre "SQL Server 2014 Développer et administrer pour la performance" sur la semi-antijointure


Sujet :

Développement SQL Server

  1. #1
    Expert éminent sénior

    Avatar de François DORIN
    Homme Profil pro
    Consultant informatique
    Inscrit en
    Juillet 2016
    Messages
    2 761
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France, Charente Maritime (Poitou Charente)

    Informations professionnelles :
    Activité : Consultant informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juillet 2016
    Messages : 2 761
    Points : 10 543
    Points
    10 543
    Billets dans le blog
    21
    Par défaut Question sur le livre "SQL Server 2014 Développer et administrer pour la performance" sur la semi-antijointure
    Bonjour,

    Je suis en train de dévorer le livre "SQL Server 2014, Développer et administrer pour la performance", et je suis tombé sur une portion que je ne comprends pas au niveau des semi-antijointure (chapitre 4, p.165). Je me permets de citer l'extrait en question :

    La semi-jointure est utilisée lorsqu'on cherche à retourner les informations d'une seule table et que l'on souhaite éliminer des lignes qui joignent une autre table. Cette semi-antijointure ne peut être qu'externe mais elle peut utiliser n'importe quel opérateur d'égalité, d'inégalité ou autre.

    Exemple :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    SELECT p1.*
    FROM T_pilote_pil AS p1
       LEFT OUTER JOIN T_pilote_pil AS p2
          ON p1.pil_chef = p2.pil_brevet;
    En quoi cette requête est une antijointure ? Où se fait le filtrage ? Personnellement, j'aurais mis une clause
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    WHERE p2.pil_brevet IS NULL
    pour obtenir l'antijointure. Quelqu'un peut-il m'expliquer ?
    François DORIN
    Consultant informatique : conception, modélisation, développement (C#/.Net et SQL Server)
    Site internet | Profils Viadéo & LinkedIn
    ---------
    Page de cours : fdorin.developpez.com
    ---------
    N'oubliez pas de consulter la FAQ C# ainsi que les cours et tutoriels

  2. #2
    Membre éprouvé Avatar de Oishiiii
    Homme Profil pro
    Administrateur de base de données
    Inscrit en
    Août 2009
    Messages
    508
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : France, Ain (Rhône Alpes)

    Informations professionnelles :
    Activité : Administrateur de base de données

    Informations forums :
    Inscription : Août 2009
    Messages : 508
    Points : 1 104
    Points
    1 104
    Par défaut
    Bonsoir,

    Je ne possède pas ce livre pour vérifier, mais ça n'a pas l'air très clair effectivement.

    Je reprend le livre de référence An introduction to Database Systems de Chris Date.
    Au chapitre 7, il décrit des opérateurs qu'il peut être intéressant d'utiliser en plus des 8 opérateurs de base définis par Ted Codd.
    Il définit notamment la Semi-jointure et la Semi-différence à laquelle fait peut-être référence la "semi-antijointure"..

    Semijoin

    [..] the semijoin of a with b (in that order), a SEMIJOIN b, is defined to be equivalent to:
    ( a JOIN b ) {X, Y}

    In other words, the semijoin of a with b is the join of a and b, projected over the attributes of a.
    The body of the result is thus loosely the tuples of a that have a counterpart in b.

    Exemple: Get S#, SNAME, STATUS, and CITY for suppliers who supply part P2:
    S SEMIJOIN (SP WHERE P# = P# ('P2') )

    La requête SQL qui correspond à la semi-jointure de l'exemple qui utilise une syntaxe Tutorial D serait donc :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    SELECT S.*
    FROM S
       NATURAL JOIN SP
    WHERE P# = 'P2'
    ou
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    SELECT S#, SNAME, STATUS, CITY 
    FROM S
       NATURAL JOIN SP
    WHERE P# = 'P2'
    Ce qui fait la semi-jointure c'est finalement les colonnes retournées dans le résultat.


    Semidifference

    The semidifference between a and b (in that order), a SEMIMINUS b, is defined to be equivalent to:
    a MINUS b ( a SEMIJOIN b )

    The body of the result is thus, loosely, the tuples of a that have no counterpart in b.
    Example: Get S#, SNAME, STATUS, and CITY for suppliers who do not supply part P2:
    S SEMIMINUS ( SP WHERE P# = P# ('P2') )

    Pour cet exemple en SQL, on peut faire ceci :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    SELECT *
    FROM S
    EXCEPT 
    SELECT S.*
    FROM S
       NATURAL JOIN SP
    WHERE P# = 'P2'
    ou effectivement une jointure externe avec une restriction supplémentaire dans la clause WHERE.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    SELECT S.*
    FROM S
       LEFT JOIN SP
          S.P# = SP.P#
    WHERE SP.P# IS NULL
    La base de données des pièces et fournisseurs qu'utilise quasi toujours Chris Date dans ses exemples :

  3. #3
    Expert éminent sénior

    Avatar de François DORIN
    Homme Profil pro
    Consultant informatique
    Inscrit en
    Juillet 2016
    Messages
    2 761
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France, Charente Maritime (Poitou Charente)

    Informations professionnelles :
    Activité : Consultant informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juillet 2016
    Messages : 2 761
    Points : 10 543
    Points
    10 543
    Billets dans le blog
    21
    Par défaut
    Bonjour,

    Merci pour la référence supplémentaire. A priori, les définitions correspondant (semi antijointure = semi difference). Dans ce cas, cela viendrait confirmer mon ressenti premier, à savoir que la requête est incomplète et qu'il manque la clause WHERE.

    Je sais que les auteurs du livre sont sur Développez. Peut être passeront-ils sur ce sujet pour apporter leur lumière sur ce point particulier
    François DORIN
    Consultant informatique : conception, modélisation, développement (C#/.Net et SQL Server)
    Site internet | Profils Viadéo & LinkedIn
    ---------
    Page de cours : fdorin.developpez.com
    ---------
    N'oubliez pas de consulter la FAQ C# ainsi que les cours et tutoriels

  4. #4
    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 : 42
    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
    Points : 12 371
    Points
    12 371
    Par défaut
    Bonjour,

    Effectivement il manque la clause WHERE qui filtre les lignes de la table de droite qui sont à NULL.
    Merci de l'avoir relevé et de nous le signaler. Nous allons devoir publier un errata.

    A bientôt !

    @++

  5. #5
    Expert éminent sénior

    Avatar de François DORIN
    Homme Profil pro
    Consultant informatique
    Inscrit en
    Juillet 2016
    Messages
    2 761
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France, Charente Maritime (Poitou Charente)

    Informations professionnelles :
    Activité : Consultant informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juillet 2016
    Messages : 2 761
    Points : 10 543
    Points
    10 543
    Billets dans le blog
    21
    Par défaut
    Bonsoir,

    Merci pour le retour et la confirmation donc que la requête est incomplète. Cela me rassure quant à ma compréhension

    J'ai relevé quelques coquilles. Je vous enverrais la liste par MP un de ces jours, quand j'aurai fini ma lecture ^^
    François DORIN
    Consultant informatique : conception, modélisation, développement (C#/.Net et SQL Server)
    Site internet | Profils Viadéo & LinkedIn
    ---------
    Page de cours : fdorin.developpez.com
    ---------
    N'oubliez pas de consulter la FAQ C# ainsi que les cours et tutoriels

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

Discussions similaires

  1. Réponses: 2
    Dernier message: 24/12/2016, 20h43
  2. Questions à propos de SQL Server 2014 In memory OLTP
    Par fred_04510 dans le forum Administration
    Réponses: 4
    Dernier message: 03/11/2014, 10h55
  3. Quelques questions sur MS-DTC et SQL Server 2008 R2
    Par philwood dans le forum Windows Serveur
    Réponses: 0
    Dernier message: 06/08/2014, 17h33
  4. Réponses: 1
    Dernier message: 05/08/2014, 11h45

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