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

SQL Oracle Discussion :

Problème sur une jointure dans le nombre de réponses


Sujet :

SQL Oracle

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre éclairé
    Homme Profil pro
    Ingénieur d'études en développements techniques
    Inscrit en
    Novembre 2005
    Messages
    244
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 53
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Ingénieur d'études en développements techniques
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Novembre 2005
    Messages : 244
    Par défaut Problème sur une jointure dans le nombre de réponses
    Bonjour,
    Je débute sur SQL Oracle et je travaille sur un schema que je ne connais pas beaucoup. Je dois extraire des enregistrements pour un emailing, voici ma 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
    24
    25
    26
    27
    28
    29
     
    SELECT DISTINCT (NAME.title || ' ' || reservation_name.sguest_firstname || ' '|| reservation_name.sguest_name) AS client_nom,
    	DECODE (LANGUAGE, 'F', 'FRANCE','E', 'ANGLETERRE') AS client_pays,
    	   (CASE
    		   WHEN opera.reservation_name.resort = 'OPERA'
    			  THEN 'Best Western Premier Opera Diamond'
    		   WHEN opera.reservation_name.resort = 'BATIGN'
    			  THEN 'Opera Batignolles Hotel'
    		   WHEN opera.reservation_name.resort = 'PPN'
    			  THEN 'Comfort et Quality Hotel Centre del Mon'
    		END
       ) AS client_hotel,
       TO_CHAR (trunc_actual_check_in_date,'DD/MM/YYYY') AS hotel_date_entree,
       TO_CHAR (trunc_actual_check_out_date,'DD/MM/YYYY') AS hotel_date_sortie,
       LOWER (phone_number) AS client_email,
       RESORT_ORIGINS_OF_BOOKING.DESCRIPTION AS origine_reservation,
       TRUNC (SYSDATE - TO_DATE (trunc_actual_check_out_date)) AS nb_jours
    FROM opera.reservation_name 
     
    JOIN OPERA.NAME ON RESERVATION_NAME.NAME_ID = NAME.NAME_ID 
    JOIN OPERA.NAME_PHONE ON RESERVATION_NAME.NAME_ID = NAME_PHONE.NAME_ID 
    JOIN OPERA.RESERVATION_SUMMARY ON RESERVATION_NAME.RESV_NAME_ID = RESERVATION_SUMMARY.EVENT_ID 
    JOIN OPERA.RESORT_ORIGINS_OF_BOOKING ON (RESERVATION_SUMMARY.RESORT = RESORT_ORIGINS_OF_BOOKING.RESORT AND RESERVATION_SUMMARY.SOURCE_CODE = RESORT_ORIGINS_OF_BOOKING.SOURCE_CODE) 
     
    WHERE resv_status = 'CHECKED OUT'
    AND TRUNC( SYSDATE - TO_DATE(TRUNC_ACTUAL_CHECK_OUT_DATE)) > 0 
    AND REGEXP_LIKE (LOWER(phone_number), '^[a-zA-Z0-9\-_]+[a-zA-Z0-9\.\-_]*@[a-zA-Z0-9\-_]+\.[a-zA-Z\.\-_]{1,}[a-zA-Z\-_]+')
    AND TRUNC_ACTUAL_CHECK_OUT_DATE >= to_date('01/09/2010', 'dd/mm/yyyy')
    ORDER BY NB_JOURS DESC;
    J'obtiens environs 400 lignes, mais quand je fais 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
    24
    25
    26
    27
    28
    29
     
    SELECT DISTINCT (NAME.title || ' ' || reservation_name.sguest_firstname || ' '|| reservation_name.sguest_name) AS client_nom,
    	DECODE (LANGUAGE, 'F', 'FRANCE','E', 'ANGLETERRE') AS client_pays,
    	   (CASE
    		   WHEN opera.reservation_name.resort = 'OPERA'
    			  THEN 'Best Western Premier Opera Diamond'
    		   WHEN opera.reservation_name.resort = 'BATIGN'
    			  THEN 'Opera Batignolles Hotel'
    		   WHEN opera.reservation_name.resort = 'PPN'
    			  THEN 'Comfort et Quality Hotel Centre del Mon'
    		END
       ) AS client_hotel,
       TO_CHAR (trunc_actual_check_in_date,'DD/MM/YYYY') AS hotel_date_entree,
       TO_CHAR (trunc_actual_check_out_date,'DD/MM/YYYY') AS hotel_date_sortie,
       LOWER (phone_number) AS client_email,
       --RESORT_ORIGINS_OF_BOOKING.DESCRIPTION AS origine_reservation,
       TRUNC (SYSDATE - TO_DATE (trunc_actual_check_out_date)) AS nb_jours
    FROM opera.reservation_name 
     
    JOIN OPERA.NAME ON RESERVATION_NAME.NAME_ID = NAME.NAME_ID 
    JOIN OPERA.NAME_PHONE ON RESERVATION_NAME.NAME_ID = NAME_PHONE.NAME_ID 
    --JOIN OPERA.RESERVATION_SUMMARY ON RESERVATION_NAME.RESV_NAME_ID = RESERVATION_SUMMARY.EVENT_ID 
    --JOIN OPERA.RESORT_ORIGINS_OF_BOOKING ON (RESERVATION_SUMMARY.RESORT = RESORT_ORIGINS_OF_BOOKING.RESORT AND RESERVATION_SUMMARY.SOURCE_CODE = RESORT_ORIGINS_OF_BOOKING.SOURCE_CODE) 
     
    WHERE resv_status = 'CHECKED OUT'
    AND TRUNC( SYSDATE - TO_DATE(TRUNC_ACTUAL_CHECK_OUT_DATE)) > 0 
    AND REGEXP_LIKE (LOWER(phone_number), '^[a-zA-Z0-9\-_]+[a-zA-Z0-9\.\-_]*@[a-zA-Z0-9\-_]+\.[a-zA-Z\.\-_]{1,}[a-zA-Z\-_]+')
    AND TRUNC_ACTUAL_CHECK_OUT_DATE >= to_date('01/09/2010', 'dd/mm/yyyy')
    ORDER BY NB_JOURS DESC;
    j'en obtiens plus de 4000. Le problème est que j'ai besoin des infos mis en commentaires, j'ai besoin d'une aide pour utiliser la données en commentaires donc d'utiliser les deux jointures, sans que cela réduise mon nombre de réponse (comme avec un left join ou right join) mais j'ai du mal à les utiliser.

    D'avance merci pour votre aide.

  2. #2
    Membre confirmé
    Homme Profil pro
    Data Ingenieur
    Inscrit en
    Mai 2006
    Messages
    133
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Data Ingenieur
    Secteur : Finance

    Informations forums :
    Inscription : Mai 2006
    Messages : 133
    Par défaut
    BOnjour,

    INNER JOIN est utilisé pour faire une jointure stricte, c'est à dire que si tu n'arrives pas à passer de la table A vers la Table B alors aucun ligne n'est ramenée

    LEFT OUTER join permet d'avoir les infos de la table A même si tu n'as pas de lien avec la table B.

    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
    27
    28
     
    SELECT DISTINCT (NAME.title || ' ' || reservation_name.sguest_firstname || ' '|| reservation_name.sguest_name) AS client_nom,
    	DECODE (LANGUAGE, 'F', 'FRANCE','E', 'ANGLETERRE') AS client_pays,
    	   (CASE
    		   WHEN opera.reservation_name.resort = 'OPERA'
    			  THEN 'Best Western Premier Opera Diamond'
    		   WHEN opera.reservation_name.resort = 'BATIGN'
    			  THEN 'Opera Batignolles Hotel'
    		   WHEN opera.reservation_name.resort = 'PPN'
    			  THEN 'Comfort et Quality Hotel Centre del Mon'
    		END
       ) AS client_hotel,
       TO_CHAR (trunc_actual_check_in_date,'DD/MM/YYYY') AS hotel_date_entree,
       TO_CHAR (trunc_actual_check_out_date,'DD/MM/YYYY') AS hotel_date_sortie,
       LOWER (phone_number) AS client_email,
       RESORT_ORIGINS_OF_BOOKING.DESCRIPTION AS origine_reservation,
       TRUNC (SYSDATE - TO_DATE (trunc_actual_check_out_date)) AS nb_jours
    FROM opera.reservation_name 
     
    INNER JOIN OPERA.NAME ON RESERVATION_NAME.NAME_ID = NAME.NAME_ID 
    INNER JOIN OPERA.NAME_PHONE ON RESERVATION_NAME.NAME_ID = NAME_PHONE.NAME_ID 
    LEFT OUTER JOIN OPERA.RESERVATION_SUMMARY ON RESERVATION_NAME.RESV_NAME_ID = RESERVATION_SUMMARY.EVENT_ID 
    LEFT OUTER JOIN OPERA.RESORT_ORIGINS_OF_BOOKING ON (RESERVATION_SUMMARY.RESORT = RESORT_ORIGINS_OF_BOOKING.RESORT AND RESERVATION_SUMMARY.SOURCE_CODE = RESORT_ORIGINS_OF_BOOKING.SOURCE_CODE) 
    WHERE resv_status = 'CHECKED OUT'
    AND TRUNC( SYSDATE - TO_DATE(TRUNC_ACTUAL_CHECK_OUT_DATE)) > 0 
    AND REGEXP_LIKE (LOWER(phone_number), '^[a-zA-Z0-9\-_]+[a-zA-Z0-9\.\-_]*@[a-zA-Z0-9\-_]+\.[a-zA-Z\.\-_]{1,}[a-zA-Z\-_]+')
    AND TRUNC_ACTUAL_CHECK_OUT_DATE >= to_date('01/09/2010', 'dd/mm/yyyy')
    ORDER BY NB_JOURS DESC;
    Pour ton cas tu vas avoir la valeur NULL dans la colonne RESORT_ORIGINS_OF_BOOKING.DESCRIPTION dans le cas où la jointure ne trouve aucune ligne correspondante

  3. #3
    Membre éclairé
    Homme Profil pro
    Ingénieur d'études en développements techniques
    Inscrit en
    Novembre 2005
    Messages
    244
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 53
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Ingénieur d'études en développements techniques
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Novembre 2005
    Messages : 244
    Par défaut
    Impeccable attila771, c'est exactement ce que je me disais, mais j'avais zappé cette histoire de outer, je m'en sers jamais je fais plutôt des left ou des right join, merci beaucoup

  4. #4
    Membre éclairé
    Homme Profil pro
    Ingénieur d'études en développements techniques
    Inscrit en
    Novembre 2005
    Messages
    244
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 53
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Ingénieur d'études en développements techniques
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Novembre 2005
    Messages : 244
    Par défaut Fausse joie
    Fausse joie, j'ai fait comme tu m'as dit ça produit le même résultat, environ 400 lignes, quand je le remets en commentaire, plus de 4000

  5. #5
    Membre confirmé
    Homme Profil pro
    Data Ingenieur
    Inscrit en
    Mai 2006
    Messages
    133
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Data Ingenieur
    Secteur : Finance

    Informations forums :
    Inscription : Mai 2006
    Messages : 133
    Par défaut
    Je cherche mais je ne vois pas pourquoi cela te ramène moins de résultat...

    Sinon pas mal la colonne phone_number où il y a de stocké une adresse mail

  6. #6
    Membre éclairé
    Homme Profil pro
    Ingénieur d'études en développements techniques
    Inscrit en
    Novembre 2005
    Messages
    244
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 53
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Ingénieur d'études en développements techniques
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Novembre 2005
    Messages : 244
    Par défaut
    c'est vrai c'est pas terrible , mais je pense que les concepteurs de l'appli, n'avait pas prévu de récupérer l'email au départ, et ils ont utilisé le champs car ils ne voulaient pas trop modifier leur applis.

    Sinon pour le nombre d'enregistrement, moi aussi je ne vois pas, le plus surprenant, il ne me ramène pas de valeur nulle, comme si le outer n'était pas pris en compte, d'ailleurs dans mes souvenirs sur Oracle on met += ou =+ je ne me souviens plus, ça fonctionne peut être mieux, je vais faire un test

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

Discussions similaires

  1. Problème sur une jointure
    Par gotcha5832 dans le forum Requêtes
    Réponses: 2
    Dernier message: 15/04/2014, 12h48
  2. Problème sur une jointure, enfin je crois
    Par zooffy dans le forum Développement
    Réponses: 6
    Dernier message: 07/02/2009, 11h44
  3. Réponses: 2
    Dernier message: 12/01/2008, 14h57
  4. Débutant SQL, problème sur une jointure censée exclure ??
    Par derfatypik dans le forum Langage SQL
    Réponses: 8
    Dernier message: 22/06/2005, 15h55
  5. limitation du nombre d'enregistrement sur une jointure
    Par coredump dans le forum Langage SQL
    Réponses: 2
    Dernier message: 18/06/2005, 16h13

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