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 :

remplacer une jointure par un filtre


Sujet :

SQL Oracle

  1. #1
    Membre actif
    Homme Profil pro
    Consultant en Business Intelligence
    Inscrit en
    Juillet 2013
    Messages
    37
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Consultant en Business Intelligence
    Secteur : Finance

    Informations forums :
    Inscription : Juillet 2013
    Messages : 37
    Points : 206
    Points
    206
    Par défaut remplacer une jointure par un filtre
    Bonjour,
    Quelqu'un peut-t-il me dire si ces deux requêtes sont-t-ils équivalents:

    l'explication est en bas de la page:
    les requêtes sont sous ORACLE
    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
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
     
    	create table TABLE_MAITRE  Select
    				a.*
    		from
    		SCHEMA.TABLE_MAITRE a 			/*REQUETE 1*/
     
    		INNER JOIN 
     
    		(Select * from SCHEMA.TABLE_2 CLP 
    				where	CARAC_LIBRE = 'VALEUR' /*Filtre 1*/
    				and nvl(date_fin_effet,'31/12/9999') >sysdate and 
    					num_col = (select max(CLP2.num_col) 
    										from SCHEMA.TABLE_2 CLP2 
    										where CLP2.num_personne = CLP.num_personne			/*REQUETE 2*/
    										and CLP2.DATE_DEBUT = CLP.DATE_DEBUT
    									)
     
    		) cl
    		On a.num_personne = cl.num_personne 
     
     
    		Inner Join
    		(Select distinct num_personne
    			from SCHEMA.TABLE_MAITRE DMA 
    			inner join 	SCHEMA.TABLE_3 
    			on (TRIM (DMA.GAR_TECH) =TRIM(TABLE_3.GAR_TECH)) 					/*REQUETE 3*/
    			where DATE_ADHE<= sysdate /*FILTRE 2*/
    			and(DATE_FIN is null or DATE_FIN > SYSDATE) 
    			and TABLE_3.TYPE in ('SANTE_0', 'SANTE_1','SANTE_2') 	
    		) Per 
    		On Per.num_personne = a.num_personne
     
     
    		where DATE_ADHE<= sysdate and (a.DATE_FIN is null or a.DATE_FIN >SYSDATE) /*FILTRE MAITRE*/
    		and TYPE_ASSURE = 'VALEUR_1' 
     
     
     
     
    	create table TABLE_MAITRE  Select
    				a.*
    		from
    		SCHEMA.TABLE_MAITRE a 			/*REQUETE 1*/
     
    		INNER JOIN 
     
    		(Select * from SCHEMA.TABLE_2 CLP 
    				where	CARAC_LIBRE = 'VALEUR' /*Filtre 1*/
    				and nvl(date_fin_effet,'31/12/9999') >sysdate and 
    					num_col = (select max(CLP2.num_col) 
    										from SCHEMA.TABLE_2 CLP2 
    										where CLP2.num_personne = CLP.num_personne			/*REQUETE 2*/
    										and CLP2.DATE_DEBUT = CLP.DATE_DEBUT
    									)
     
    		) cl
    		On a.num_personne = cl.num_personne 
     
     
    		where DATE_ADHE<= sysdate and (a.DATE_FIN is null or a.DATE_FIN >SYSDATE) /*FILTRE MAITRE*/
    		and TYPE_ASSURE = 'VALEUR_1'
    and a.gar_tech in (liste_garantie_obtenu_avec_filtre_TABLE_3.TYPE in ('SANTE_0', 'SANTE_1','SANTE_2') )
    en effet, j'ai supprimé la requête 3 du premier programme pour le remplacer par le filtre qui nous permet d'avoir les garanties relatives au filtre 'SANTE_0', 'SANTE_1','SANTE_2' ,
    Un collègue me dit que les requêtes ne sont pas équivalente, mais pour moi comme je récupère le numéro de personne qui est déjà dans la requête 1.
    Si besoinde plus d'éclaircissement, n'hésitez pas.
    Cordialement.

  2. #2
    Modérateur
    Avatar de Waldar
    Homme Profil pro
    Customer Success Manager @Vertica
    Inscrit en
    Septembre 2008
    Messages
    8 452
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Customer Success Manager @Vertica
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2008
    Messages : 8 452
    Points : 17 820
    Points
    17 820
    Par défaut
    Non, les deux requêtes ne sont pas équivalentes. Si un num_personne n'est pas présent dans TABLE_3 mais que les autres critères sont remplis, il ne sortira pas dans la première requête alors qu'il sortira dans la seconde.

    Vous pouvez pas contre passer par un test d'existence WHERE EXISTS ... plutôt que de faire la jointure sur le select distinct.

Discussions similaires

  1. [Système] Remplacer une chaine par un lien hypertexte
    Par Bisûnûrs dans le forum Langage
    Réponses: 10
    Dernier message: 06/06/2007, 09h34
  2. [VB.NET] Comment remplacer une couleur par une autre?
    Par jazz matazz dans le forum VB.NET
    Réponses: 5
    Dernier message: 11/02/2006, 14h29
  3. [sql] remplacer une virgule par un point
    Par shiners300 dans le forum Oracle
    Réponses: 1
    Dernier message: 23/12/2005, 19h19
  4. Remplacer une lettre par une image (on peut ?)
    Par tunidesign dans le forum EDI, CMS, Outils, Scripts et API
    Réponses: 8
    Dernier message: 23/10/2005, 12h13
  5. Réponses: 2
    Dernier message: 15/03/2005, 15h40

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