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

Langage SQL Discussion :

full Outer Join


Sujet :

Langage SQL

  1. #1
    Membre à l'essai
    Inscrit en
    Mai 2009
    Messages
    31
    Détails du profil
    Informations personnelles :
    Âge : 37

    Informations forums :
    Inscription : Mai 2009
    Messages : 31
    Points : 24
    Points
    24
    Par défaut full Outer Join
    Bonjour,

    Actuellement en stage dans une grosse boîte, je découvre le sql "avancé". J'avais des bases aquis seul. Mais je veux faire un truc très propre la.

    J'ai eu un soucis, j'ai découvert que mon soucis était régler grace à FULL OUTER JOIN. J'ai lu beaucoup de topic à ce sujet sur le forum, ainsi que le tuto http://sqlpro.developpez.com/cours/s...ures/#LIII-D-2.

    J'ai reussi (avant de lire ces topics) à m'en sortir avec la syntaxe *=

    Si j'ai bien compris c'est plutôt vieu comme méthode, et plus trop d'actualité ? Le topic http://www.developpez.net/forums/d52...-dit-jointure/ m'interpelle donc. J'ai compris avec http://www.developpez.net/forums/m1345752-37/ que je devais utiliser JOIN

    Sauf que je n'arrive pas à appliquer cette syntaxe, je dois avouer ne pas avoir le temps de le faire correctement maintenant. J'ai pas non plus envi de laisser mon *=, j'aimerais quelque chose de propre.

    Pourriez vous-m'aidez ?

    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
    24
    25
    26
    SELECT
     	A.Call_ID 'N° Ticket', /* ID Ticket */
    	A.Call_HistoFlag 'Etat', /* Etat ouvert/fermé */
    	B.Lang_Text 'Queue', /* Queue */
    	A.Call_Client_ID 'ID Client TMP', /* Numéro du client, en attendant de récupérer toutes les infos dans la table clients */
    	(CONVERT(CHAR(23),A.Call_DateEntered,120)) 'Date de création', /* Date ouverture Ticket avec convert de la date */
    	'Date de fermeture' = CASE A.Call_HistoFlag WHEN 1 THEN (CONVERT(CHAR(23),A.Call_DateCompleted,120)) ELSE '' END, /* Date fermeture ticket et convert + affichage uniquement si le ticket a été fermé */
    	C.Client_FirstName 'Prénom Client',
    	C.Client_LastName 'Nom Client',
    	C.Client_City 'Localisation Client',
    	'Activité' = CASE D.lang_Text WHEN '(Aucun)' THEN '' ELSE D.lang_Text END, /* Activité si remplie */
    	'Domaine' = CASE A.Call_ivProdType_ID WHEN 0 THEN '' ELSE E.ivProdType_Desc1 END, /* Domaine si remplie */
    	'Application' = CASE A.Call_ivProduct_ID WHEN 0 THEN '' ELSE F.ivProdData_Text END /* Application si remplie */	
     
    FROM Calls A, Lang B, Client C, Lang D, ivProdType E, ivProdData F /* Tables */
     
    WHERE
    	A.Call_LST_CALLSTAT <> 5515 /* N'est pas une requete */
    	AND A.Call_LST_QUEUE in (6228, 7969) /* Ticket pour ISA */
    	AND A.Call_LST_QUEUE = B.Lang_Id /* Jointure */
    	AND A.Call_Client_ID = C.Client_ID /* Jointure pour la table client*/
    	AND A.Call_LST_CALLCAT = D.Lang_ID /* Type de requête */
    	AND A.Call_ivProdType_ID *= E.ivProdType_ID /* Dimaine */
    	AND A.Call_ivProduct_ID *= F.ivProdData_ProductID /* Application */
     
    ORDER BY A.Call_ID DESC /* Tri */
    J'ai laissé ma requête complète, j'espère que c'est compréhensible.

    Merci.

  2. #2
    Membre éprouvé
    Profil pro
    Inscrit en
    Août 2008
    Messages
    861
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2008
    Messages : 861
    Points : 965
    Points
    965
    Par défaut
    Bonjour,

    Vous avez oublié de préciser votre SGBD.
    La syntaxe normalisée (utilisation de JOIN) donnerait quelque chose comme ça :
    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
    24
    25
    26
    SELECT
     	A.Call_ID 'N° Ticket', /* ID Ticket */
    	A.Call_HistoFlag 'Etat', /* Etat ouvert/fermé */
    	B.Lang_Text 'Queue', /* Queue */
    	A.Call_Client_ID 'ID Client TMP', /* Numéro du client, en attendant de récupérer toutes les infos dans la table clients */
    	(CONVERT(CHAR(23),A.Call_DateEntered,120)) 'Date de création', /* Date ouverture Ticket avec convert de la date */
    	'Date de fermeture' = CASE A.Call_HistoFlag WHEN 1 THEN (CONVERT(CHAR(23),A.Call_DateCompleted,120)) ELSE '' END, /* Date fermeture ticket et convert + affichage uniquement si le ticket a été fermé */
    	C.Client_FirstName 'Prénom Client',
    	C.Client_LastName 'Nom Client',
    	C.Client_City 'Localisation Client',
    	'Activité' = CASE D.lang_Text WHEN '(Aucun)' THEN '' ELSE D.lang_Text END, /* Activité si remplie */
    	'Domaine' = CASE A.Call_ivProdType_ID WHEN 0 THEN '' ELSE E.ivProdType_Desc1 END, /* Domaine si remplie */
    	'Application' = CASE A.Call_ivProduct_ID WHEN 0 THEN '' ELSE F.ivProdData_Text END /* Application si remplie */	
     
    FROM Calls A
    JOIN Lang B ON A.Call_LST_QUEUE = B.Lang_Id
    JOIN Client C ON A.Call_Client_ID = C.Client_ID
    JOIN Lang D ON A.Call_LST_CALLCAT = D.Lang_ID
    FULL OUTER JOIN ivProdType E ON A.Call_ivProdType_ID = E.ivProdType_ID
    FULL OUTER JOIN ivProdData F ON A.Call_ivProduct_ID = F.ivProdData_ProductID /* Tables */
     
    WHERE
    	A.Call_LST_CALLSTAT <> 5515 /* N'est pas une requete */
    	AND A.Call_LST_QUEUE IN (6228, 7969) /* Ticket pour ISA */
     
    ORDER BY A.Call_ID DESC /* Tri */
    Il s'agit de ramener les conditions de votre clause WHERE dans les conditions de jointures ON correspondantes.

  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 849
    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 849
    Points : 52 975
    Points
    52 975
    Billets dans le blog
    6
    Par défaut
    1) vous ne devez pas de faire de jointure dans la WHERE. C'est une hérésie. La norme est JOIN depuis 1992. Vous avez 17 and de retard.
    2) *= est spécifique à SQL Server et donne des résultats faux. Je l'ai expliqué ici : http://blog.developpez.com/sqlpro/p5...-et-le-nouvea/

    Donc pour votre claude FROM :
    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
     
    FROM   Calls A
           INNER JOIN Lang B
                 ON A.Call_LST_QUEUE = B.Lang_Id 
           INNER JOIN Client C
                 ON A.Call_Client_ID = C.Client_I
           INNER JOIN Lang D
                 ON A.Call_LST_CALLCAT = D.Lang_ID
           LEFT OUTER JOIN ivProdType E
                 ON A.Call_ivProdType_ID = E.ivProdType_ID
           LEFT OUTER JOIN ivProdData F
                 ON A.Call_ivProduct_ID = F.ivProdData_ProductID 
     
    WHERE  A.Call_LST_CALLSTAT <> 5515 /* N'est pas une requete */
      AND  A.Call_LST_QUEUE IN (6228, 7969) /* Ticket pour ISA */
    A +

  4. #4
    Membre à l'essai
    Inscrit en
    Mai 2009
    Messages
    31
    Détails du profil
    Informations personnelles :
    Âge : 37

    Informations forums :
    Inscription : Mai 2009
    Messages : 31
    Points : 24
    Points
    24
    Par défaut
    Merci pour votre aide. J'ai fini ma requête hier, je vais pouvoir me pencher sur mon soucis de syntaxe.

    J'ai tester vos 2 solutions, après la correction de 2-3 fautes de frappes, j'execute Snipah (enfin sa méthode ) en 6 secondes, contre 14 pour SQLpro

    Actuellement, j'execute la mienne en 2secondes mais avec du *=

    Je bidouille ma requête avec vos exemples, merci.

    Je marque comme résolu, mais je repasserais par la dire si j'ai réussi ou non et donner mon résultat

    Edit 1 : J'avais pas répondu à ton 1)2)

    1) vous ne devez pas de faire de jointure dans la WHERE. C'est une hérésie. La norme est JOIN depuis 1992. Vous avez 17 and de retard.
    2) *= est spécifique à SQL Server et donne des résultats faux. Je l'ai expliqué ici :
    Howi, du calme, je sais pour le retard, et si je m'en foutais, je serais pas venu poster pour corriger l'erreur. J'ai suivi 0 jours de cours sql, et je pense tout de même à venir corriger et me renseigner, slow down ...

    Et oui j'ai lus l'explication, j'ai bien dis dans mon post que j'ai fais des recherches ... Ceci dit, dans mon cas, je n'avais pas d'erreur de résultat.

    C'est moi ou le ton est ? pas acceuillant ? J'ai l'impression de me faire un peu incendier comme un gamin à venir demander de l'aide, alors que j'aurais pu garder un travail pourri et me la fermer ?!

    Edit 2 : Ok j'ai compris la méthode, j'applique et je vois le temps d'execution

    Edit 3 : Parfait, j'ai reussi à appliquer tout cela avec les lignes que j'ai rajouté ensuite, j'ai 03 sec d'exe. C'est correcte. J'ai le bon nombre de réponse. Et j'ai compris le principe de la syntaxe. J'irais relire les cours pour voir les différence entre les différentes jointures. J'ai vu que vous même déjà n'utilisez pas les mêmes. J'ai adopté la solution de SQLpro qui me semblait plus correcte dans mon cas. Bonne journée.

  5. #5
    Membre éprouvé
    Profil pro
    Inscrit en
    Août 2008
    Messages
    861
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2008
    Messages : 861
    Points : 965
    Points
    965
    Par défaut
    J'irais relire les cours pour voir les différence entre les différentes jointures. J'ai vu que vous même déjà n'utilisez pas les mêmes.
    Oui, le LEFT OUTER JOIN proposé par SQLpro semble plus adapté, il l'a sans doute déduit de ta requête, car ton post mentionnait un FULL OUTER JOIN.

    Dans ta requete, le LEFT OUTER JOIN te renverra (en plus des lignes qui vérifient la jointure) les lignes de "Calls" qui n'ont pas de correspondance dans "ivProdType" et "ivProdData", mais pas les lignes de "ivProdType" et "ivProdData" qui n'ont pas de correspondance dans "Calls". Le FULL OUTER JOIN ramènera également les lignes de "ivProdType" et "ivProdData" qui n'ont pas de correspondance dans "Calls".
    Ca semble pas clair mon histoire

  6. #6
    Membre à l'essai
    Inscrit en
    Mai 2009
    Messages
    31
    Détails du profil
    Informations personnelles :
    Âge : 37

    Informations forums :
    Inscription : Mai 2009
    Messages : 31
    Points : 24
    Points
    24
    Par défaut
    Si impéccable J'ai parler de Full sans savoir de quoi je parlais, j'étais en train encore de chercher les différents types de jointure.

    Merci pour ton explication, c'est good

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

Discussions similaires

  1. L'équivalent de FULL OUTER JOIN sous ACCESS
    Par Le Pharaon dans le forum Langage SQL
    Réponses: 2
    Dernier message: 24/03/2013, 12h36
  2. Erreur FULL OUTER JOIN
    Par SwiTz dans le forum Requêtes
    Réponses: 14
    Dernier message: 02/04/2009, 13h33
  3. [Oracle 9] Probleme. FULL OUTER JOIN
    Par West01 dans le forum Langage SQL
    Réponses: 5
    Dernier message: 17/10/2006, 07h46
  4. [ORACLE 9i] Equivalent du Full Outer Join
    Par Worldofdada dans le forum Oracle
    Réponses: 10
    Dernier message: 02/11/2005, 14h56
  5. Remplacer FULL OUTER JOIN
    Par funrighd dans le forum Requêtes
    Réponses: 2
    Dernier message: 17/07/2004, 10h54

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