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

MS SQL Server Discussion :

Jointure externe sous sqlserver


Sujet :

MS SQL Server

  1. #1
    Membre régulier
    Inscrit en
    Mars 2005
    Messages
    319
    Détails du profil
    Informations forums :
    Inscription : Mars 2005
    Messages : 319
    Points : 80
    Points
    80
    Par défaut Jointure externe sous sqlserver
    Bonjour,

    Je viens du monde Oracle,
    sous Oracle pour faire une jointure externe j'utilise la syntaxe avec (+).
    Le truc est que cette syntaxe est propore à Oracle et ne fonctionne pas sous Sqlserver.
    J'utilise la syntaxe ANSI mais le résultat obtenu ne me parait pas correct.

    Je vous explique mon cas,
    J'ai une table de référence qui contient une liste de client.
    Je dispose d'une table annexe qui contient ses mêmes clients et d'autres.

    CLIENT_REF
    ID NOM TEL
    1 Intel 09090909
    2 AOL 08080808
    3 IBM 07070707
    CLIENT_AN
    ID NOM REF STATUT TEL
    1 Intel C1 V 09090909
    1 Intel C1 NV 09090909
    1 Intel R1 V 90909
    1 Intel V1 V 90909
    2 AOL C1 V 0707078
    2 AOL R1 V 0707079
    2 AOL R1 NV 0707
    2 AOL R2 V 0707076
    3 IBM C1 V 0167678
    3 IBM V1 V 0167677
    3 IBM F4 V 016767

    En faite ce que je souhaite c'est avoir sur une même ligne pour chaque ID de la table CLIENT_REF,
    la liste des différentes annexes de REF C1 et R1 valide existantes.
    Comme ceci par exemple :
    ID NOM TEL NOM_C1 REF_C1 STATUT_C1 TEL_C1 NOM_R1 REF_R1 STATUT_R1 TEL_R1
    1 Intel 09090909 Intel C1 V 09090909 Intel R1 V 90909
    2 AOL 08080808 AOL C1 V 0707078 AOL R1 V 0707079
    3 IBM 07070707 C1 V 0167678 NULL NULL NULL NULL
    J'ai écris cette requête :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    SELECT
    CR.ID,
    CR.NOM,
    CR.TEL,
    CAC.NOM_C1, 
    CAC.REF_C1, 
    CAC.STATUT_C1, 
    CAC.TEL_C1, 
    CAR.NOM_R1, 
    CAR.REF_R1, 
    CAR.STATUT_R1, 
    CAR.TEL_R1
    FROM
    CLIENT_REF CR 
    left outer join CLIENT_AN CAC
    on CR.ID=CAC.ID
    left outer join CLIENT_AN CAR
    on CR.ID=CAR.ID
    WHERE
    CAC.REF='C1' and 
    CAC.STATUT='V' and
    CAR.REF='R1' and 
    CAR.STATUT='V'
    Le problème est que sous Sqlserver, il manque une ligne.
    J'ai ceci :
    ID NOM TEL NOM_C1 REF_C1 STATUT_C1 TEL_C1 NOM_R1 REF_R1 STATUT_R1 TEL_R1
    1 Intel 09090909 Intel C1 V 09090909 Intel R1 V 90909
    2 AOL 08080808 AOL C1 V 0707078 AOL R1 V 0707079
    au lieu de cela :
    ID NOM TEL NOM_C1 REF_C1 STATUT_C1 TEL_C1 NOM_R1 REF_R1 STATUT_R1 TEL_R1
    1 Intel 09090909 Intel C1 V 09090909 Intel R1 V 90909
    2 AOL 08080808 AOL C1 V 0707078 AOL R1 V 0707079
    3 IBM 07070707 C1 V 0167678 NULL NULL NULL NULL
    Je comprends pas.

    Merci à tous

  2. #2
    Membre éprouvé
    Homme Profil pro
    Administrateur de base de données
    Inscrit en
    Août 2009
    Messages
    623
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

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

    Informations forums :
    Inscription : Août 2009
    Messages : 623
    Points : 1 049
    Points
    1 049
    Par défaut
    Essaye plutôt comme ceci :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
     
    SELECT CR.ID 
    	, CR.NOM 
    	, CR.TEL 
    	, CAC.NOM_C1 
    	, CAC.REF_C1 
    	, CAC.STATUT_C1 
    	, CAC.TEL_C1 
    	, CAR.NOM_R1 
    	, CAR.REF_R1 
    	, CAR.STATUT_R1 
    	, CAR.TEL_R1 
    FROM CLIENT_REF CR 
    	LEFT OUTER JOIN CLIENT_AN CAC ON CR.ID=CAC.ID 
    		AND CAC.REF='C1' 
    		AND CAC.STATUT='V' 
    	LEFT OUTER JOIN CLIENT_AN CAR ON CR.ID=CAR.ID 
    		AND CAR.REF='R1' 
    		AND CAR.STATUT='V'
    Blog Perso | Kankuru (logiciel gratuit pour SQL Server)

  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 770
    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 770
    Points : 52 726
    Points
    52 726
    Billets dans le blog
    5
    Par défaut
    Citation Envoyé par Melvine Voir le message
    Bonjour,

    Je viens du monde Oracle,
    sous Oracle pour faire une jointure externe j'utilise la syntaxe avec (+).
    Le truc est que cette syntaxe est propore à Oracle et ne fonctionne pas sous Sqlserver.
    J'utilise la syntaxe ANSI mais le résultat obtenu ne me parait pas correct
    ....

    J'ai écris cette requête :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    SELECT
    ...
    FROM
    CLIENT_REF CR 
    left outer join CLIENT_AN CAC
    on CR.ID=CAC.ID
    left outer join CLIENT_AN CAR
    on CR.ID=CAR.ID
    WHERE
    CAC.REF='C1' and 
    CAC.STATUT='V' and
    CAR.REF='R1' and 
    CAR.STATUT='V'
    C'est pas SQL Server, c'est vous qui commenttez une erreur. Faire un WHERE retire les "valeur" NULLes. Vous devez :
    1) soit intégrer les restrictions dans la jointure
    2) soit ajouter un OR maColonne IS NULL dans la restriction !
    En effet, une restriction sur du NULL ne donne jamais rien...
    Or la jointure externe ramène du NULL que vous supprimez ensuite dans le WHERE ! C'est comme si vous faisiez une jointure interne....

    Bref, apprenez le SQL. Mon site Web, comme mon bouquin peuvent vous y aider !

    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
    Membre régulier
    Inscrit en
    Mars 2005
    Messages
    319
    Détails du profil
    Informations forums :
    Inscription : Mars 2005
    Messages : 319
    Points : 80
    Points
    80
    Par défaut
    Merci pour vos réponses.
    Cela fonctionne avec ta darkelend.
    SQLpro, le truc,
    c'est que je suis habitué au requête avec la syntaxe = et non pas les inner,left outer ....
    Sous Oracle en faisant la jointure externe (+),
    Oracle me ramène le bon résultat, je n'ai pas besoin de rajouter
    OR maColonne IS NULL
    Quand tu dis ajouter macolonne IS NULL, tu veux dire pour chaque filtre ,comme ci-dessous ?
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    FROM
    CLIENT_REF CR 
    LEFT OUTER JOIN CLIENT_AN CAC
    ON CR.ID=CAC.ID
    LEFT OUTER JOIN CLIENT_AN CAR
    ON CR.ID=CAR.ID
    WHERE
    (CAC.REF='C1' OR CAC.REF IS NULL) AND 
    (CAC.STATUT='V' OR CAC.STATUT IS NULL) AND
    (CAR.REF='R1' OR CAR.REF IS NULL) AND 
    (CAR.STATUT='V' OR CAR.STATUT IS NULL)
    PS : Si ton bouquin parle de jointure , jointure externe avec la syntaxe LEFT OUTER JOIN ,RIGHT OUTER ...,
    je veux bien que tu m'envois le titre

  5. #5
    Expert éminent
    Avatar de StringBuilder
    Homme Profil pro
    Chef de projets
    Inscrit en
    Février 2010
    Messages
    4 154
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 45
    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 154
    Points : 7 403
    Points
    7 403
    Billets dans le blog
    1
    Par défaut
    Pour information, SQL Server supporte (enfin, avant, ça marchait, j'ai pas testé sur les versions récentes) lui aussi une syntaxe similaire au (+) d'Oracle.

    Il s'agit de *= et =*

    Attention cependant :
    - Tout comme (+) d'Oracle, c'est absolument pas normalisé (la preuve, c'est pas la même syntaxe)
    - Ça fait très longtemps que je l'ai pas utilisé, mais de mémoire, le comportement diffère un peu, et les deux syntaxes ne sont pas absolument équivalentes
    - Dans tous les cas la seule chose à retenir, c'est que ça fait plus de 12 ans qu'on DOIT utiliser le mot clé JOIN (INNER, LEFT OUTER, RIGHT OUTER, FULL OUTER, NATURAL) et les "jointures" dans le WHERE sont à éviter comme la peste

    Cette syntaxe n'est plus supportée depuis la version 2012, mais l'était encore sur 2008R2 :
    http://msdn.microsoft.com/en-us/libr...=sql.105).aspx
    On ne jouit bien que de ce qu’on partage.

  6. #6
    Membre éprouvé
    Homme Profil pro
    Administrateur de base de données
    Inscrit en
    Août 2009
    Messages
    623
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

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

    Informations forums :
    Inscription : Août 2009
    Messages : 623
    Points : 1 049
    Points
    1 049
    Par défaut
    *= est supporté par SQL Server 2000 ou jusqu'à 2008R2 avec une base en mode de compatibilité 2000 (80 je crois).
    Et ca fait plus de 12 ans car il me semble que la norme date de 1992
    Blog Perso | Kankuru (logiciel gratuit pour SQL Server)

  7. #7
    Expert éminent
    Avatar de StringBuilder
    Homme Profil pro
    Chef de projets
    Inscrit en
    Février 2010
    Messages
    4 154
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 45
    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 154
    Points : 7 403
    Points
    7 403
    Billets dans le blog
    1
    Par défaut
    Ah oui, tiens, 22... T'ain j'me fais vieux d'un coup...
    On ne jouit bien que de ce qu’on partage.

  8. #8
    Rédacteur

    Avatar de SQLpro
    Homme Profil pro
    Expert bases de données / SQL / MS SQL Server / Postgresql
    Inscrit en
    Mai 2002
    Messages
    21 770
    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 770
    Points : 52 726
    Points
    52 726
    Billets dans le blog
    5
    Par défaut
    Citation Envoyé par StringBuilder Voir le message
    Pour information, SQL Server supporte (enfin, avant, ça marchait, j'ai pas testé sur les versions récentes) lui aussi une syntaxe similaire au (+) d'Oracle.

    Il s'agit de *= et =*

    Attention cependant :
    - Tout comme (+) d'Oracle, c'est absolument pas normalisé (la preuve, c'est pas la même syntaxe)
    - Ça fait très longtemps que je l'ai pas utilisé, mais de mémoire, le comportement diffère un peu, et les deux syntaxes ne sont pas absolument équivalentes
    - Dans tous les cas la seule chose à retenir, c'est que ça fait plus de 12 ans qu'on DOIT utiliser le mot clé JOIN (INNER, LEFT OUTER, RIGHT OUTER, FULL OUTER, NATURAL) et les "jointures" dans le WHERE sont à éviter comme la peste

    Cette syntaxe n'est plus supportée depuis la version 2012, mais l'était encore sur 2008R2 :
    http://msdn.microsoft.com/en-us/libr...=sql.105).aspx
    ATTENTION DANGER

    Le *= de SQL Server ne correspond pas du tout à celui d'oracle.

    Ces anciennes syntaxes sont mathématiquement fausses !

    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/ * * * * *

  9. #9
    Membre éprouvé
    Profil pro
    Inscrit en
    Octobre 2002
    Messages
    956
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2002
    Messages : 956
    Points : 1 199
    Points
    1 199
    Par défaut
    bonjour

    A Melvine
    Quand tu dis ajouter macolonne IS NULL, tu veux dire pour chaque filtre ,comme ci-dessous ?
    Oui
    Regarde la ligne de ton résultat souhaité dans ton premier post et tu verras que c'est null.
    Quant à
    Oracle me ramène le bon résultat, je n'ai pas besoin de rajouter OR maColonne IS NULL
    Non mais tu es obligé de mettre un (+) pour les même clauses Where, donc ça revient au même.
    Bon weekend
    Soazig

Discussions similaires

  1. Jointure externe sous condition
    Par amAtunisian dans le forum PostgreSQL
    Réponses: 2
    Dernier message: 03/10/2013, 23h26
  2. Jointures externes sous ASA
    Par David_Prog dans le forum SQL Anywhere
    Réponses: 3
    Dernier message: 30/03/2010, 09h17
  3. Equivalent jointure externe (+) ORACLE sous ACCESS ?
    Par caboche dans le forum Requêtes et SQL.
    Réponses: 1
    Dernier message: 07/08/2007, 14h05
  4. sous requêtes et jointures externes
    Par Harpoon dans le forum Requêtes
    Réponses: 4
    Dernier message: 03/05/2007, 19h43
  5. [CR 8.5] Jointure Externe sous Crystal report
    Par alpachico dans le forum SAP Crystal Reports
    Réponses: 1
    Dernier message: 28/06/2005, 14h06

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