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
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"
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
         INTERLOC_CIVIL || ' ' || INTERLOC_NOM || ' ' || INTERLOC_PRENOM AS "Interlocuteur",
Ici à quel moment l'un ou l'autre change ?

Code : Sélectionner tout - Visualiser dans une fenêtre à part
 TRUNC(ENTPIEDFAC_DATEPRCHREL) AS "DateProchaineReleve",
Ici on arrondie, si par exemple la date est 12.5 on met 12


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,
Ici on a une sous-requête qui correspond à une vue ajoutée dans le FROM ?
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 ligne
Code : Sélectionner tout - Visualiser dans une fenêtre à part
CONTRAT_REF AS "Reference",
j'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 ?

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