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 :

Optimisation d'un script


Sujet :

Langage SQL

  1. #21
    Membre émérite
    Profil pro
    Inscrit en
    Octobre 2002
    Messages
    956
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2002
    Messages : 956
    Par défaut
    Rebonjour,
    N'y-a-t-il que moi que ça choque l'utilisation de fonction de fenêtrage Min, max et count avec un order by dans le over?
    Pour un ROW_NUMBER() je le conçois mais pour les min, max et count je ne vois pas à quoi il peut servir.
    Par ailleurs, j'avoue mon ignorance quand aux indications
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    rows between 1 preceding and 1 preceding
    A+
    Soazig

  2. #22
    Membre averti
    Homme Profil pro
    Étudiant
    Inscrit en
    Avril 2018
    Messages
    27
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Avril 2018
    Messages : 27
    Par défaut
    Bonjour SOAZIG ;
    Merci pour votre aide , je vais suivre tes conseilles et voir aprés le résultat , merci beaucoup et bon 1 mai

  3. #23
    Membre averti
    Homme Profil pro
    Étudiant
    Inscrit en
    Avril 2018
    Messages
    27
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Avril 2018
    Messages : 27
    Par défaut
    Rebonjour Soazig ,
    Merci beaucoup pour votre aide , mais comme je peux pas l'essayer OJR , mais j'essaye de comprendre un peu le script :
    - dans chaque sélect on trouve ordre , il sert à quoi ( je veux juste apprendre je connais pas grand chose )
    - et pour les index que je dois créer , est ce que ça va pas créer des anomalies vu que ptr ils les ont déja créer .
    Merci encore une fois pour votre aide , je dois l'essayer demain et l'expliquer pendant la réunion du matin

  4. #24
    Membre émérite
    Profil pro
    Inscrit en
    Octobre 2002
    Messages
    956
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2002
    Messages : 956
    Par défaut
    Rebonjour,
    Pour ordre j'ai fait ce que je te suggérai à mon premier poste.
    J'ai remplacé
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    case when COD_EVT in ('74','43') then '1000'  when COD_EVT in ('21', '42') then '0' else COD_EVT end
    par Ordre.
    On a une table de correspondance nommé Correspondance qui est sous forme de with et qui indique
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    Cod_EVT;Ordre
    74;1000
    43:1000
    21;0
    42;0
    Donc pour ce qui est dans la table de correspondance à la place du case when il suffit de prendre la colonne Ordre, pour ce qui n'y est pas on est sur le else du case when on met COD_EVT. C'est pour cela que la jointure sur Correspondance est externe, pour prendre en compte ce qui n'est pas dans la table de correspondance.
    [Edit]Comme le case when apparaissait dans un order by je l'ai appelé ordre mais si fonctionnellement ça a un nom, il faut utiliser ce nom
    [/edit]
    Pour les index maintenant, je ne comprends pas ptr dans
    et pour les index que je dois créer , est ce que ça va pas créer des anomalies vu que ptr ils les ont déja créer .
    Si l'index existe il ne faut pas le créer, je croyais qu'il n'y avait pas d'index sur tes tables à part la clé primaire.
    Si tu crées des index non uniques cela ne créera pas d'anomalie, cela peut ralentir les écritures dans les tables concernées.
    [Edit]Remarque on peut créer plusieurs index par tables sans problème, et c'est très fréquent[/Edit]
    Cordialement
    Soazig

  5. #25
    Membre averti
    Homme Profil pro
    Étudiant
    Inscrit en
    Avril 2018
    Messages
    27
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Avril 2018
    Messages : 27
    Par défaut
    je vous remercie pour tout ces détailles , merci beaucoup

  6. #26
    Membre averti
    Homme Profil pro
    Étudiant
    Inscrit en
    Avril 2018
    Messages
    27
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Avril 2018
    Messages : 27
    Par défaut
    Bonjour Soazig ;
    Voila j'ai lancé l script mais j'ai des erreurs ,avec et sans correspondance Nom : sans correspondance.PNG
Affichages : 300
Taille : 47,4 KoNom : avec correspondance.PNG
Affichages : 294
Taille : 43,5 Ko ,
    et j'ai essayé de garder le mm script d'avant et de mettre les 3 lignes en commentaires pour voir si il ramènent ou pas (finalement ils ramènent perce-que 2000 lignes en plus )

  7. #27
    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
    Par défaut
    Bonjour,

    Citation Envoyé par soazig Voir le message
    N'y-a-t-il que moi que ça choque l'utilisation de fonction de fenêtrage Min, max et count avec un order by dans le over?
    Pour un ROW_NUMBER() je le conçois mais pour les min, max et count je ne vois pas à quoi il peut servir.
    Cela permet de limiter la fenêtre aux lignes qui précédent la ligne courante, selon l'ordre spécifié.
    très pratique notamment avec un SUM pour obtenir une somme cumulée croissante.

  8. #28
    Membre émérite
    Profil pro
    Inscrit en
    Octobre 2002
    Messages
    956
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2002
    Messages : 956
    Par défaut
    Bonjour,
    Merci aieeeuuuuu, j'aurais appris quelque chose.
    Pour lotofski, et ses erreurs d'execution; peut-être que Teradata ne permet pas l'usage de CTE dans un insert, peux-tu essayer juste le select?
    Que donne les index, parce que c'est surtout là que tu peux gagner?
    Cordialement
    Soazig

  9. #29
    Modérateur
    Avatar de Waldar
    Homme Profil pro
    Sr. Specialist Solutions Architect @Databricks
    Inscrit en
    Septembre 2008
    Messages
    8 454
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 48
    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 454
    Par défaut
    Citation Envoyé par soazig Voir le message
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    rows between 1 preceding and 1 preceding
    C'est une clause des fonctions de fenêtrage qui permettent de borner leur utilisation à un nombre de lignes précis, ici de 1 en arrière jusqu'à 1 en arrière, on est pile dans l'équivalence de la fonction LAG(1).
    Cette fonction n'a été implémentée qu'assez récemment dans Teradata, en v15 ou 16 je ne sais plus.

    À noter qu'on peut aussi utiliser RANGE à la place de ROWS ce qui permet d'avoir des bornes dynamiques & plus fonctionnelles que techniques.
    C'est déjà référencé dans cet article qui date de 2004 :
    https://lalystar.developpez.com/fonc...alytiques/#LII

  10. #30
    Modérateur
    Avatar de Waldar
    Homme Profil pro
    Sr. Specialist Solutions Architect @Databricks
    Inscrit en
    Septembre 2008
    Messages
    8 454
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 48
    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 454
    Par défaut
    Citation Envoyé par soazig Voir le message
    Pour lotofski, et ses erreurs d'execution; peut-être que Teradata ne permet pas l'usage de CTE dans un insert, peux-tu essayer juste le select ?
    La syntaxe with insert select est propre à SQL-Server, et c'est une aberration d'avoir un ordre DML qui apparaît en plein milieu d'un SELECT.

    Citation Envoyé par soazig Voir le message
    Que donne les index, parce que c'est surtout là que tu peux gagner?
    Probablement la table a grossie et les index ne seront pas utilisés
    Teradata étant un MPP les index, hors primaires, sont très très rarement utiles.

  11. #31
    Membre émérite
    Profil pro
    Inscrit en
    Octobre 2002
    Messages
    956
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2002
    Messages : 956
    Par défaut
    Bonjour,
    Concernant la requête que j'ai proposée, tu peux remplacer le with Correspondance par une vrai table ou par une table temporaire.
    L'autre solution mais qui devient lourde,c'est de remplacer l'utilisation de correspondance par sa définition comme ceci.
    Mais déjà que la requête n'est pas très lisible, ça commence à être vraiment compliqué.
    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
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    118
    119
    120
    121
    122
    123
    124
    125
    126
    127
    128
    129
    130
    131
    132
    133
    134
    135
    136
    137
    138
    139
    140
    141
    142
    143
    144
    145
    146
    147
    148
    149
    150
    151
    152
    153
    154
    155
    156
    157
    158
    159
    160
    161
    162
    163
    164
    165
    166
    167
    168
    169
    170
    171
    172
    173
    174
    175
    176
    177
    178
    179
    180
    181
    182
    183
    184
    185
    186
    187
    188
    189
    190
    191
    192
    193
    194
    195
    196
    197
    198
    199
    200
    201
    202
    203
    204
    205
    206
    207
    208
    209
    210
    211
    212
    213
    214
    215
    216
    217
    218
    219
    220
    221
    222
    223
    224
    225
    226
    227
    228
    229
    230
    231
    232
    233
    234
    235
    236
    237
    INSERT INTO STAMP_OPS_EVT_TMP
    Select 
    	--ETAPE TMP7: Pour chaque station qui n est pas nouvelle (voir TMP5), on reporte le numéro précédent
    	NUM_RTE
    	--On reporte les numéro de station qui ne changent pas.
        ,case when NUM_STA is null then max(NUM_STA) OVER (PARTITION BY IDT_CNT_RCU, NUM_RTE  ORDER BY DAT_EVT_UTC ASC, Ordre desc, DAT_DEP asc ROWS UNBOUNDED PRECEDING) else NUM_STA 
        end as NUM_STA
    	,COD_EVT
        ,IDT_CNT_RCU
        ,DAT_EVT_UTC
        ,DAT_LOC_EVT
        ,DAT_DEP
        ,LCT_SCA
    	,ESC_ORI
        ,ESC_DST
        ,NOM_PRN_ORI
        ,NOM_PRN_DST
        ,NUM_VOL_DEP
        ,NUM_VOL_ARV
        ,IDT_VOL
     
     FROM 
    	(
    	--ETAPE TMP6: Pour chaque route, pour chaque nouvelle station, On affecte un numéro croissant à chaque nouvelle station (voir TMP5)
    	Select 
    	NUM_RTE
     
    		--S il s agit d une nouvelle station (voir TMP5), on effectue un compte les indicateurs sur les lignes pécédentes pour attribuer le bon numéro de station
    		,case 
    		when NUM_STA=1 then coalesce(Count(NUM_STA) OVER (PARTITION BY IDT_CNT_RCU, NUM_RTE  ORDER BY DAT_EVT_UTC ASC, Odre desc, DAT_DEP asc ROWS UNBOUNDED PRECEDING),0) 
    		else NUM_STA 
    		end as 
    		 NUM_STA
    		,COD_EVT
    		,IDT_CNT_RCU
    		,DAT_EVT_UTC
    		,DAT_LOC_EVT
    		,DAT_DEP
    		,LCT_SCA
    		,ESC_ORI
    		,ESC_DST
    		,NOM_PRN_ORI
    		,NOM_PRN_DST
    		,NUM_VOL_DEP
    		,NUM_VOL_ARV
    		,IDT_VOL
    		,Ordre
    	 FROM 
    		(
    		-- ETAPE TMP5 Pour chaque route, on identifie les nouvelles stations avec un indicateur '1'
    		Select 
    			NUM_RTE
    			--indicateur de changement de station pour chaque route
    			,case 
    				when coalesce(min(LCT_SCA) over ( PARTITION BY IDT_CNT_RCU , NUM_RTE order by DAT_EVT_UTC ASC, Ordre desc, DAT_DEP asc  rows between 1 preceding and 1 preceding), 0) <> LCT_SCA  then  1
    				else null
    				end  as NUM_STA
    			,COD_EVT
    			,IDT_CNT_RCU
    			,DAT_EVT_UTC
    			,DAT_LOC_EVT
    			,DAT_DEP
    			,LCT_SCA
    			,ESC_ORI
    			,ESC_DST
    			,NOM_PRN_ORI
    			,NOM_PRN_DST
    			,NUM_VOL_DEP
    			,NUM_VOL_ARV
    			,IDT_VOL
    			,Ordre
    		FROM 
    			(
    			--ETAPE TMP4: Pour les lignes qui ne sont pas un début de route, on reporte le numéro précédent
    				Select 
    				case when NUM_RTE is null then 
    											-- Si la ligne n'a pas de prédécésseur alors on mets 1 sinon on mets la valeur du prédécesseur
    											Case when max(NUM_RTE) OVER (PARTITION BY IDT_CNT_RCU ORDER BY DAT_EVT_UTC ASC, Ordre desc, DAT_DEP asc ROWS UNBOUNDED PRECEDING) is null
    											then 1
    											Else max(NUM_RTE) OVER (PARTITION BY IDT_CNT_RCU ORDER BY DAT_EVT_UTC ASC, Ordre desc, DAT_DEP asc ROWS UNBOUNDED PRECEDING)
    											end
    										else NUM_RTE end as NUM_RTE
    				,COD_EVT
    				,IDT_CNT_RCU
    				,DAT_EVT_UTC
    				,DAT_LOC_EVT
    				,DAT_DEP
    				,LCT_SCA
    				,ESC_ORI
    				,ESC_DST
    				,NOM_PRN_ORI
    				,NOM_PRN_DST
    				,NUM_VOL_DEP
    				,NUM_VOL_ARV
    				,IDT_VOL
    				,Ordre
    			FROM 
    				(
    				--ETAPE TMP3 : On affecte un numéro croissant à chaque début de route
    				SELECT distinct
    					 --s il s agit d un début de route, on effectue un compte les indicateurs sur les lignes pécédentes pour attribuer le bon numéro de début de route
    					case 
    					when RTE=1 then coalesce(Count(RTE) OVER (PARTITION BY IDT_CNT_RCU ORDER BY DAT_EVT_UTC asc , case when COD_EVT in ('74','43') then '1000'  when COD_EVT in ('21', '42') then '0' else COD_EVT end desc, DAT_DEP asc ROWS UNBOUNDED PRECEDING),0) 
    					else RTE 
    					end as NUM_RTE			   
    					,TMP2.COD_EVT
    					,TMP2.IDT_CNT_RCU
    					,TMP2.DAT_EVT_UTC
    					,TMP2.DAT_LOC_EVT
    					,TMP2.DAT_DEP
    					,TMP2.LCT_SCA
    					,TMP2.ESC_ORI
    					,TMP2.ESC_DST
    					,TMP2.NOM_PRN_ORI
    					,TMP2.NOM_PRN_DST
    					,TMP2.NUM_VOL_DEP
    					,TMP2.NUM_VOL_ARV
    					,TMP2.IDT_VOL
    					,Ordre
    				FROM
    				   ( --ETAPE TMP2: On identifie les début de route avec des indicateur '1' 
    					SELECT
    						--On affecte un indicateur  pour chaque début de route du Receptacle
    						--s il s agit d un premier evènement (sauf iSC) sans début identifié
    						case 
    						when ROW_NUMBER() over ( PARTITION BY IDT_CNT_RCU 
    												order by DAT_EVT_UTC ASC, Ordre desc, DAT_DEP asc  ) = 1 
    								AND COD_EVT <>'iSC' 
    								AND COD_EVT <>'6'
    						then 1
    						--s il s agit bien d un début identifié
    						when COD_EVT in ('74','43') 
    						then 1
    						-- s il n y a pas de début de route mais que la ligne précédente est une fin de route, alors on crée une nouvelle route quand même
    						when coalesce(min(COD_EVT) over ( PARTITION BY IDT_CNT_RCU order by DAT_EVT_UTC ASC, Ordre desc, DAT_DEP asc  rows between 1 preceding and 1 preceding), '#') in ('21', '42')  
    						then 1
    						else null end as RTE
    					   ,TMP1.*
    					   FROM
     
     
    						   (
    							-- ETAPE TMP1: On reccupère les information de base
    							SELECT 
    								'RECEPTACLE' as LVL
    								,COD_EVT
    								,IDT_CNT_RCU
    								--,DAT_EVT_UTC as NON_CORR_DAT_EVT_UTC
    								--,cast (NULL as Timestamp(0)) as NON_CORR_DAT_EVT_CNT_UTC
    								,DAT_EVT_UTC
    								,DAT_LOC_EVT
    								,DAT_DEP
    								,LCT_SCA
    								,ESC_ORI
    								,ESC_DST
    								,NOM_PRN_ORI
    								,NOM_PRN_DST
    								,NUM_VOL_DEP
    								,NUM_VOL_ARV
    								,IDT_VOL
    								,COALESCE(C.Ordre, EVT2.COD_EVT) as Ordre
    							FROM
    								DWHFRT.STAMP_EVT_CNT EVT2
    							left outer join 
    							(
    								select '74' as Code_EVT, '1000' as Ordre
    								union
    								select '43' as Code_EVT, '1000' as Ordre
    								union
    								select '21' as Code_EVT, '0' as Ordre
    								union 
    								select '42' as Code_EVT, '0' as Ordre
    							) C on
    							EVT2.COD_EVT=C.COD_EVT
    							--Receptacle level
    							WHERE IDT_TYP = 'R'
     
    							UNION 
     
    							SELECT 
    								 'CONTAINER' as LVL
    								 ,EVT.COD_EVT
    								,CNT.IDT_CNT_RCU
    								--DR_REC0 Event at the COntainer level must have the data of the max(STAMP_CNT_RCU.DAT_DEB_VLD)
    								--,EVT.DAT_EVT_UTC as NON_CORR_DAT_EVT_UTC
    								--,CNT.DAT_DEB_VLD as NON_CORR_DAT_EVT_CNT_UTC
    								--,Las plus grande des deux dates :(CNT.DAT_DEB_VLD  , EVT.DAT_EVT_UTC     ) as DAT_EVT_UTC
    								,CAST(
    										SUBSTRING (CAST ( 
    												 TO_TIMESTAMP(
    															GREATEST(
    															COALESCE(TO_CHAR(CNT.DAT_DEB_VLD , 'yyyymmddhh24miss'),'19000101000000'),
    															COALESCE(TO_CHAR(EVT.DAT_EVT_UTC, 'yyyymmddhh24miss'),'19000101000000')
    															),'yyyymmddhh24miss')
    										AS VARCHAR(25))  FROM 1 FOR 19)  
    									AS TIMESTAMP(0) FORMAT 'YYYY/MM/DDBHH:MI:SS')
    								AS DAT_EVT_UTC
    								,EVT.DAT_LOC_EVT
    								,EVT.DAT_DEP
    								,EVT.LCT_SCA
    								,EVT.ESC_ORI
    								,EVT.ESC_DST
    								,EVT.NOM_PRN_ORI
    								,EVT.NOM_PRN_DST
    								,EVT.NUM_VOL_DEP
    								,EVT.NUM_VOL_ARV
    								,EVT.IDT_VOL
    								,COALESCE(C.Ordre, EVT.COD_EVT) as Ordre
    							FROM
    								DWHFRT.STAMP_EVT_CNT EVT
     
    							INNER JOIN DWHFRT.STAMP_CNT_RCU CNT
    									ON EVT.IDT_COD_CNT = CNT.IDT_COD_CNT
    							left outer join 
    							(
    								select '74' as Code_EVT, '1000' as Ordre
    								union
    								select '43' as Code_EVT, '1000' as Ordre
    								union
    								select '21' as Code_EVT, '0' as Ordre
    								union 
    								select '42' as Code_EVT, '0' as Ordre
    							) C on
    							EVT.COD_EVT=C.COD_EVT
    							--Container level
    							WHERE EVT.IDT_TYP = 'C'
    							  AND CNT.IDT_TYP = 'R'		
    							) as TMP1
    							--where IDT_CNT_RCU='AEDXBASESTOABTT70050001000054'
    					) as TMP2
    				) as TMP3
     
    			) as TMP4
    		) as TMP5
    	) as TMP6
     --order by 4,5
    ;
    Pour Waldar merci pour le lien sur les fonctions de fenêtrage, j'apprends plein de chose.

    PS : Je ne suis pas du tout sure que ça améliorera les perf!
    Cordialement
    Soazig

  12. #32
    Membre averti
    Homme Profil pro
    Étudiant
    Inscrit en
    Avril 2018
    Messages
    27
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Avril 2018
    Messages : 27
    Par défaut
    Bonsoir , Merci soazig vu que je peux travailler de chez moi ojr , j'ai essayé le dernier script , et j'ai le message suivant Nom : erreur.PNG
Affichages : 242
Taille : 37,5 Ko

  13. #33
    Membre averti
    Homme Profil pro
    Étudiant
    Inscrit en
    Avril 2018
    Messages
    27
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Avril 2018
    Messages : 27
    Par défaut
    Et voici le résultat attendu Nom : REP.PNG
Affichages : 243
Taille : 21,5 KoNom : REP2.PNG
Affichages : 261
Taille : 49,9 Ko

  14. #34
    Membre averti
    Homme Profil pro
    Étudiant
    Inscrit en
    Avril 2018
    Messages
    27
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Avril 2018
    Messages : 27
    Par défaut
    Bonjour tout le monde , voici la rps de mon sup ;

    Le but est de passer de requêtes imbriquées de ce type:
    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
    insert into TABLE_FINALE
    select ..
     
    from
     
         (select ..
     
         from ...
     
              (select
     
              from
     
              ...
     
              from TABLE_ORIGINE)
     
         )

    A plusieurs requêtes séparées les unes après les autres:



    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    insert into TABLE_INTERMEDIAIRE_1
     
    select ...
     
    from TABLE_ORIGINE;


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    insert into TABLE_INTERMEDIAIRE_2
     
    select ...
     
    from TABLE_INTERMEDIAIRE_1;


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    insert into TABLE_INTERMEDIAIRE_3
     
    select ...
     
    from TABLE_INTERMEDIAIRE_2;


    ...



    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    insert into TABLE_FINALE
     
    select ...
     
    from DERNIERE_TABLE_INTERMEDIAIRE;


    puis vider les TABLE_INTERMEDIAIRE.



    C’est tout.

    Rien à modifier dans les conditions des requêtes.



    Et à la fin il faut comparer pour vérifier que les résultats obtenus par ce script sont strictement identiques aux résultats obtenus avec le script d’origine.

  15. #35
    Modérateur
    Avatar de al1_24
    Homme Profil pro
    Retraité
    Inscrit en
    Mai 2002
    Messages
    9 143
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 65
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Retraité
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mai 2002
    Messages : 9 143
    Par défaut
    Une fois que tu auras écrit tes requêtes, si tu rencontres des problèmes de syntaxe ou d'exécution, tu pourras revenir ici pour exposer ce qui ne va pas...
    Modérateur Langage SQL
    Règles du forum Langage SQL à lire par tous, N'hésitez pas à consulter les cours SQL
    N'oubliez pas le bouton et pensez aux balises
    [code]
    Si une réponse vous a aidé à résoudre votre problème, n'oubliez pas de voter pour elle en cliquant sur
    Aide-toi et le forum t'aidera : Un problème exposé sans mentionner les tentatives de résolution infructueuses peut laisser supposer que le posteur attend qu'on fasse son travail à sa place... et ne donne pas envie d'y répondre.

  16. #36
    Rédacteur

    Avatar de SQLpro
    Homme Profil pro
    Expert bases de données / SQL / MS SQL Server / Postgresql
    Inscrit en
    Mai 2002
    Messages
    22 039
    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 : 22 039
    Billets dans le blog
    6
    Par défaut
    Citation Envoyé par soazig Voir le message
    Rebonjour,
    N'y-a-t-il que moi que ça choque l'utilisation de fonction de fenêtrage Min, max et count avec un order by dans le over?
    Pour un ROW_NUMBER() je le conçois mais pour les min, max et count je ne vois pas à quoi il peut servir.
    Par ailleurs, j'avoue mon ignorance quand aux indications
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    rows between 1 preceding and 1 preceding
    A+
    Soazig

    Cela permet par exemple de faire des SUM cumulées.
    Par exemple avoir le CA de la boite au jour le jour.
    Ainsi le 1er janvier le CA sera les ventes du 1
    Le 2 janvier, ce sera le cumul des 1 et 2 janvier et ainsi de suite...

    Avec rows between ... preceding. vous pouvez, par exemple, faire une fenêtre glissante Exemple : CA "glissant" sur 7 jours (une semaine.

    Lisez l'article que j'ai écrit à ce sujet :
    https://sqlpro.developpez.com/articl...clause-window/
    Cela vous ouvrira de nouveaux horizons


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

Discussions similaires

  1. optimisation d'un script d'inscription en PHP.
    Par JeanJean75 dans le forum Langage
    Réponses: 20
    Dernier message: 24/12/2009, 01h25
  2. Execution/optimisation d'un script php ultra long
    Par Skar dans le forum Langage
    Réponses: 2
    Dernier message: 11/06/2009, 17h23
  3. [MySQL] Besoin d'aide pour optimisation d'un script très lourd
    Par macadamgrafik dans le forum PHP & Base de données
    Réponses: 2
    Dernier message: 25/02/2009, 16h08
  4. Optimisation d'un script d'analyse
    Par azerwhite dans le forum EDI, CMS, Outils, Scripts et API
    Réponses: 6
    Dernier message: 21/10/2008, 09h48
  5. Réponses: 6
    Dernier message: 23/01/2007, 17h20

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