Bonjour à tous,
débutant en SQL, j'ai acquis les bases il y a de cela quelques temps et j'ai vraiment du mal à comprendre le fonctionnement de la requête ci-dessous.
Ayant retiré toutes les parties répétitives ou comprises, la requête n'est pas fonctionnelle et des tables qui n'existent pas sont utilisées. Mais peu importe car mon but est de comprendre le fonctionnement SQL et pas la requête en elle même.
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 SELECT CONTRAT_REF AS "Reference", DECODE(TYPECONTR_REF, 'C', CONTRAT_REF || ' - Contrat principal du site ' || (SELECT SITE_NOM FROM SITE, PDS WHERE PDS_NOMSITE = SITE_REF AND PDS_REF = CONTRAT_REFPDS), FNGETLIBELLECONTRAT(CONTRAT_REF)) AS "Libelle", INTERLOC_CIVIL || ' ' || INTERLOC_NOM || ' ' || INTERLOC_PRENOM AS "Interlocuteur", TRUNC(ENTPIEDFAC_DATEPRCHREL) AS "DateProchaineReleve" FROM CONTRAT, REGROUPADMIN, ( SELECT MAX(CONTRATFAC_NUMFAC) CONTRATFAC_NUMFAC, CONTRAT_REF CONTRATFAC_REFCONTRAT FROM ( SELECT CONTRATFAC_NUMFAC, FROM CONTRAT WHERE CONTRAT_REFCLIENT = :Reference AND CONTRATFAC_REFCONTRSERV = CONTRAT_REF UNION SELECT CONTRAT_REF FROM CONTRATFAC, WHERE CONTRAT_REFCLIENT = :Reference AND CONTRATFAC_REFCONTRSERV = AVENANTCONTR_REFCONTRINI ) GROUP BY CONTRAT_REF ) CONTRATFAC, WHERE CONTRAT_REF IN ( SELECT DECODE(AVENANTCONTR_REFCONTRINI, NULL, CONTRAT_REF, AVENANTCONTR_REFCONTRNEW) FROM CONTRAT, V_DERNAVENANTCONTR WHERE CONTRAT_REFCLIENT = :Reference AND AVENANTCONTR_REFCONTRNEW (+) = CONTRAT_REF AND NOT EXISTS ( SELECT 1 FROM AVENANTCONTR WHERE AVENANTCONTR_REFCONTROLD = CONTRAT_REF AND AVENANTCONTR_REFCONTROLD <> AVENANTCONTR_REFCONTRNEW ) UNION SELECT DECODE(AVENANTCONTR_REFCONTRINI, NULL, CONTRAT_REF, AVENANTCONTR_REFCONTRNEW) FROM CONTRAT, COMPOREGROUP, REGROUP, V_DERNAVENANTCONTR WHERE REGROUP_REFPAYEUR = :Reference AND COMPOREGROUP_IDFREGROUP = REGROUP_IDF AND CONTRAT_REF = COMPOREGROUP_REFCONTRAT AND AVENANTCONTR_REFCONTRNEW (+) = CONTRAT_REF AND COMPOREGROUP_REPARTPAIEMT > 0 AND NOT EXISTS ( SELECT 1 FROM AVENANTCONTR WHERE AVENANTCONTR_REFCONTROLD = CONTRAT_REF AND AVENANTCONTR_REFCONTROLD <> AVENANTCONTR_REFCONTRNEW ) ) AND PDS_REF = CONTRAT_REFPDS AND TARIFENERG_CODETARIFDNN (+) = CONTRAT_CODETARIFDNN ORDER BY CONTRAT_ETAT, CONTRAT_REF
Je met ici tout ce que je crois avoir compris ainsi que mes questions !
Le SELECT me permet de "sélectionner le nom de cette colonne" AS "le nom que je lui donne" FROM "la table d'ou elle provient" WHERE "condition permettant de filtrer et retourner les lignes de la colonne en question" AND "condition2" ORDER BY "triage de l'ordre des lignes retournées".
DECODE correspond à DECODE(variable, valeur1, retour1, valeur2, retour2, retourSinon) mais je n'arrive pas à comprend la syntaxe particulière utilisée ici
Si TYPECONTR_REF vaut C (mais ici c'est quoi qui vaut C ?? Le nom de la colonne TYPECONTR_REF ?) on retourne CONTRAT_REF ou ' - Contrat principal du site ' ou un SELECT, puis je suppose que FNGETLIBELLECONTRAT(CONTRAT_REF) correspond au retourSinon, donc là ici la colonne qui sera nommé Libelle correspondra soit à ça soit à ça en fonction du case je suppose.
Code : Sélectionner tout - Visualiser dans une fenêtre à part DECODE(TYPECONTR_REF, 'C', CONTRAT_REF || ' - Contrat principal du site ' || (SELECT SITE_NOM FROM SITE, PDS WHERE PDS_NOMSITE = SITE_REF AND PDS_REF = CONTRAT_REFPDS), FNGETLIBELLECONTRAT(CONTRAT_REF)) AS "Libelle"
Ici à quel moment l'un ou l'autre change ?
Code : Sélectionner tout - Visualiser dans une fenêtre à part INTERLOC_CIVIL || ' ' || INTERLOC_NOM || ' ' || INTERLOC_PRENOM AS "Interlocuteur",
Ici on arrondie, si par exemple la date est 12.5 on met 12
Code : Sélectionner tout - Visualiser dans une fenêtre à part TRUNC(ENTPIEDFAC_DATEPRCHREL) AS "DateProchaineReleve",
Ici on a une sous-requête qui correspond à une vue ajoutée dans le 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
16
17
18
19 FROM CONTRAT, REGROUPADMIN, ( SELECT MAX(CONTRATFAC_NUMFAC) CONTRATFAC_NUMFAC, CONTRAT_REF CONTRATFAC_REFCONTRAT FROM ( SELECT CONTRATFAC_NUMFAC, FROM CONTRAT WHERE CONTRAT_REFCLIENT = :Reference AND CONTRATFAC_REFCONTRSERV = CONTRAT_REF UNION SELECT CONTRAT_REF FROM CONTRATFAC, WHERE CONTRAT_REFCLIENT = :Reference AND CONTRATFAC_REFCONTRSERV = AVENANTCONTR_REFCONTRINI ) GROUP BY CONTRAT_REF ) CONTRATFAC,
Nommé CONTRATFAC, elle correspond au troisième appel de FROM elle effectue un SELECT et dans ce SELECT on effectue un FROM qui a également besoin d'une sous requête afin de faire une union (donc il fusionnent les résultats des deux colonnes), ensuite un GROUP BY de la première sous-requête est effectué puis le résultat se retrouve dans CONTRATFAC. Cependant, je ne comprend pas le :Reference car ici à ma première lignej'utilise le terme Reference, cela signifie t'il que partout ou j'écrit :Reference c'est comme si je référençai la colonne CONTRAT_REF ?
Code : Sélectionner tout - Visualiser dans une fenêtre à part CONTRAT_REF AS "Reference",
Et pour ce qui est de la suite de la requête je vois à peu près le genre de condition que l'on retrouve mais je pense que je n'ai pas besoin de me pencher trop dessus car c'est assez spécifique au table en question et que les conditions sont amené à changer en fonction de chaque requête, c'est pourquoi je préfère d'abord bien comprendre le fonctionnement de base de Oracle.
N'importe quelle aide serai appréciable, peu importe si elle répond à mes questions, tant qu'elle me permet de mieux comprendre le fonctionnement, je vous en serai redevable, merci énormément d'avance à vous pour votre aide !
Cordialement
Partager