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 :

Case dans INNER JOIN


Sujet :

Langage SQL

  1. #1
    Membre du Club
    Inscrit en
    Avril 2013
    Messages
    148
    Détails du profil
    Informations forums :
    Inscription : Avril 2013
    Messages : 148
    Points : 58
    Points
    58
    Par défaut Case dans INNER JOIN
    Bonjour à tous,

    j'aimerai savoir s'il est possible de mettre en place une sorte de système "CASE WHEN" afin de choisir entre 2 "INNER JOIN".
    Voici la requête en question:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    SELECT CRUIS.ID_BKIN ,CRUIS.TITI ,CRUIS.TATA, CRUIS.ID_BKCS ,  CRUIS.BOOKINGSTATUSCODE,CRUIS.CATEGORYCODE 
    FROM [dbo].[ODS_BKCS_CRUISE_SAILING] CRUIS 
         INNER JOIN 
         (              SELECT TOTO.ID_BKIN ,TOTO.TITI ,TOTO.TATA, MAX(TOTO.ID_BKCS) as MAX_ID_BKCS             
                        FROM [dbo].[ODS_BKCS_CRUISE_SAILING] TOTO
                        GROUP BY TOTO.ID_BKIN ,TOTO.TITI,TOTO.TATA 
         ) TOTOG
         ON CRUIS.ID_BKIN = TOTOG.ID_BKIN AND CRUIS.ID_BKCS = TOTOG.MAX_ID_BKCS
    J'aimerai que si :
    "SELECT COUNT(DISTINCT ID_BKCS )
    FROM [dbo].[ODS_BKCS_CRUISE_SAILING] CRUIS
    GROUP BY ID_BKIN
    HAVING COUNT(CustomerID) > 1;"

    alors j'utilise cette jointure
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    	 SELECT CRUIS.ID_BKIN ,CRUIS.TITI ,CRUIS.TATA, CRUIS.ID_BKCS , CRUIS.BOOKINGSTATUSCODE,CRUIS.CATEGORYCODE 
         FROM DWH_BOOKING.[dbo].[ODS_BKCS_TUTU_SAILING] CRUIS 
         INNER JOIN 
                    (SELECT CRUISG.ID_BKIN ,CRUISG.TITI ,CRUISG.TATA, MAX(CRUISG.ID_BKCS) as MAX_ID_BKCS  FROM DWH_BOOKING.[dbo].[ODS_BKCS_TUTU_SAILING] CRUISG 
    				INNER JOIN DWH_BOOKING.[dbo].[ODS_BKCP_TUTU_PARTICIPANT] CRUIP ON CRUISG.ID_SOURCE = CRUIP.ID_SOURCE and CRUISG.ID_BKCS = CRUIP.ID_BKCS
    				INNER JOIN  DWH_BOOKING.[dbo].[ODS_BKPA_PARTICIPANT] PA    ON CRUIP.ID_SOURCE = PA.ID_SOURCE and PA.PASSENGERNO = CRUIP.PASSENGERNO
    				where PA.MARKETINGID is not null and CRUISG.BOOKINGSTATUSCODE <> 'CXL' GROUP BY CRUISG.ID_BKIN ,CRUISG.TITI,CRUISG.TATA
    Sinon j'utilise celle-là:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    SELECT CRUIS.ID_BKIN ,CRUIS.TITI ,CRUIS.TATA, CRUIS.ID_BKCS ,  CRUIS.BOOKINGSTATUSCODE,CRUIS.CATEGORYCODE 
    FROM [dbo].[ODS_BKCS_CRUISE_SAILING] CRUIS 
         INNER JOIN 
         (              SELECT TOTO.ID_BKIN ,TOTO.TITI ,TOTO.TATA, MAX(TOTO.ID_BKCS) as MAX_ID_BKCS             
                        FROM [dbo].[ODS_BKCS_CRUISE_SAILING] TOTO
                        GROUP BY TOTO.ID_BKIN ,TOTO.TITI,TOTO.TATA 
         ) TOTOG
         ON CRUIS.ID_BKIN = TOTOG.ID_BKIN AND CRUIS.ID_BKCS = TOTOG.MAX_ID_BKCS
    Merci à tous !

  2. #2
    Modérateur
    Avatar de Waldar
    Homme Profil pro
    Sr. Specialist Solutions Architect @Databricks
    Inscrit en
    Septembre 2008
    Messages
    8 453
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Sr. Specialist Solutions Architect @Databricks
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2008
    Messages : 8 453
    Points : 18 386
    Points
    18 386
    Par défaut
    Pas directement en SQL - bien qu'on puisse contourner en exécutant les deux requêtes avec un union all et en filtrant a posteriori - mais faites le directement en T-SQL.
    Assignez une valeur à votre requête de référence, testez là et prenez le bon embranchement.

  3. #3
    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,

    Je rajouterai que je soupçonne un défaut de modélisation.
    Difficile d'être certain, car vous n'avez pas fournit modèle, mais je pense qu'il faudrait mettre en place un héritage, quand je vois deux tables distinctes avec autant de colonnes portant le même nom...
    et je pense que votre problème serait alors bien plus simplement à résoudre avec une requête plus classique.

    encore une fois, ce ne sont que des suppositions...

  4. #4
    Membre du Club
    Inscrit en
    Avril 2013
    Messages
    148
    Détails du profil
    Informations forums :
    Inscription : Avril 2013
    Messages : 148
    Points : 58
    Points
    58
    Par défaut
    D'accord merci!


    Encore une petite question, j'aimerai dans cette requête récupérer le MAX(ID_BKCS), mais rajouter certains cas.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    SELECT CRUISG.ID_BKIN ,CRUISG.CRUISEID ,CRUISG.CABINNO, CRUISG.BOOKINGSTATUSCODE , MAX(CRUISG.ID_BKCS) as MAX_ID_BKCS             
    FROM DWH_BOOKING.[dbo].[ODS_BKCS_CRUISE_SAILING] CRUISG
    WHERE CRUISG.ID_SOURCE = '1037535' 
    GROUP BY CRUISG.ID_BKIN ,CRUISG.CRUISEID,CRUISG.CABINNO,CRUISG.BOOKINGSTATUSCODE
    Si pour un ensemble "RUISG.ID_BKIN ,CRUISG.CRUISEID ,CRUISG.CABINNO" il y a plusieurs lignes avec plusieurs (+ d'1) bookingstatucode ET dont un = 'CXL', alors je prends le max(ID_BKS) au statut 'BKD' ou 'QUO'.

    Merci de votre aide.

  5. #5
    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
    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
    WITH
    T AS
    (
    SELECT COUNT(DISTINCT ID_BKCS )
    FROM   dbo.ODS_BKCS_CRUISE_SAILING AS CRUIS 
    GROUP  BY ID_BKIN 
    HAVING COUNT(CustomerID) > 1
    )
    SELECT CRUIS.ID_BKIN ,CRUIS.TITI ,CRUIS.TATA, CRUIS.ID_BKCS , CRUIS.BOOKINGSTATUSCODE, CRUIS.CATEGORYCODE 
    FROM   DWH_BOOKING.dbo.ODS_BKCS_TUTU_SAILING AS CRUIS 
           INNER JOIN (SELECT CRUISG.ID_BKIN ,CRUISG.TITI ,CRUISG.TATA, MAX(CRUISG.ID_BKCS) as MAX_ID_BKCS  
    	               FROM   DWH_BOOKING.dbo.ODS_BKCS_TUTU_SAILING AS CRUISG 
    				          INNER JOIN DWH_BOOKING.dbo.ODS_BKCP_TUTU_PARTICIPANT AS CRUIP 
    						        ON CRUISG.ID_SOURCE = CRUIP.ID_SOURCE and CRUISG.ID_BKCS = CRUIP.ID_BKCS
    				          INNER JOIN  DWH_BOOKING.dbo.ODS_BKPA_PARTICIPANT AS PA    
    						        ON CRUIP.ID_SOURCE = PA.ID_SOURCE and PA.PASSENGERNO = CRUIP.PASSENGERNO
    				   WHERE  PA.MARKETINGID is not null 
    				     AND  CRUISG.BOOKINGSTATUSCODE <> 'CXL' 
    				   GROUP  BY CRUISG.ID_BKIN ,CRUISG.TITI, CRUISG.TATA) AS TOTOD
                  ON CRUIS.ID_BKIN = TOTOD.ID_BKIN AND CRUIS.ID_BKCS = TOTOD.MAX_ID_BKCS 
    			     AND EXISTS(SELECT * FROM T)
    UNION ALL
    SELECT CRUIS.ID_BKIN ,CRUIS.TITI ,CRUIS.TATA, CRUIS.ID_BKCS ,  CRUIS.BOOKINGSTATUSCODE,CRUIS.CATEGORYCODE 
    FROM   dbo.ODS_BKCS_CRUISE_SAILING AS CRUIS 
           INNER JOIN (SELECT TOTO.ID_BKIN ,TOTO.TITI ,TOTO.TATA, MAX(TOTO.ID_BKCS) as MAX_ID_BKCS             
                       FROM   dbo.ODS_BKCS_CRUISE_SAILING AS TOTO
                       GROUP  BY TOTO.ID_BKIN ,TOTO.TITI,TOTO.TATA) AS TOTOG
                 ON CRUIS.ID_BKIN = TOTOG.ID_BKIN AND CRUIS.ID_BKCS = TOTOG.MAX_ID_BKCS
    			 AND NOT EXISTS(SELECT * FROM T);
    A +

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

Discussions similaires

  1. Sous-requête dans INNER JOIN vs IN
    Par dorian53 dans le forum Langage SQL
    Réponses: 8
    Dernier message: 26/09/2017, 14h55
  2. [SQL] Affichage dans Inner Join
    Par daheda dans le forum Bases de données
    Réponses: 5
    Dernier message: 21/03/2009, 14h20
  3. [Hibernate] Inner join dans hibernate
    Par Saloucious dans le forum Hibernate
    Réponses: 3
    Dernier message: 24/08/2005, 09h38
  4. INNER JOIN ... ON ... ou jointure dans clause where
    Par schmur1 dans le forum MS SQL Server
    Réponses: 12
    Dernier message: 28/06/2005, 09h16
  5. Nombre de clauses ON dans un INNER JOIN
    Par Shadow aok dans le forum Requêtes
    Réponses: 5
    Dernier message: 30/06/2004, 15h42

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