Aide - Recherche - Membres - Calendrier
Version complète : Amateurs de SQL, faîtes vous plaisir
Forum GenerationMP3 > Communauté GMP3 > Le Bistrot > Jeux, blagues, et vidéos
Nicholas
Bon, pour vous, ça sera une blague, mais moi, c'est mon taf bigyellow.gif
Résumé des courses : 350 lignes (avant indentation) et 51 Select imbriqués. Je sais pas qui m'a pondu cette merde que j'dois optimiser, mais j'le hais.

Je précise pour ceux qui ont pas le courage d'aller jusqu'au bout que ce n'est qu'une et une seule requête...

SELECT pasbon.no_commande,
pasbon.site,
pasbon.enlevement,
pasbon.installation,
pasbon.livraison,
pasbon.nb_imp,
pasbon.verif_qte qte,
'ATTENTION' remarque,
DECODE (commentaire, '0', 'OK', 'Pb sur la ligne de cout') coût
FROM ( SELECT DISTINCT enlev.no_commande,
enlev.site,
enlev.qte enlevement,
instal.qte installation,
livrai.qte livraison,
mat.nb_imp,
enlev.qte - DECODE (mat.nb_imp, NULL, '0', mat.nb_imp) verif_qte
FROM (SELECT cde.no_commande,
site,
art.famille_article,
art.modele_article,
art.qte
FROM (SELECT no_commande,
site_livraison site,
famille_article,
modele_article,
SUM (qte_commandee) qte
FROM artiacom
GROUP BY no_commande,
site_livraison,
famille_article,
modele_article) art,
(SELECT cle_commande,
no_commande
FROM commande
WHERE e_operation = 'Rédac-CV' AND
champ_libre_4 = 'M-PARC' AND
validation_anpe like 'F%i' AND
validation_emetteur LIKE 'V%') cde
WHERE art.no_commande = cde.no_commande AND
famille_article = 'Enlèvement') enlev,
(SELECT cde.no_commande,
site,
art.famille_article,
art.modele_article,
art.qte
FROM (SELECT no_commande,
site_livraison site,
famille_article, modele_article,
SUM (qte_commandee) qte
FROM artiacom
GROUP BY no_commande,
site_livraison,
famille_article,
modele_article) art,
(SELECT cle_commande,
no_commande
FROM commande
WHERE e_operation = 'Rédac-CV' AND
champ_libre_4 = 'M-PARC' AND
validation_anpe like 'F%i' AND
validation_emetteur LIKE 'V%') cde
WHERE art.no_commande = cde.no_commande AND
famille_article IN ('Installation') AND
modele_article <> '1 à 5 imprimantes' AND
modele_article <> '6 et plus imprimantes') instal,
(SELECT cde.no_commande,
site,
art.famille_article,
art.modele_article,
art.qte
FROM (SELECT no_commande,
site_livraison site,
famille_article,
modele_article,
SUM (qte_commandee) qte
FROM artiacom
GROUP BY no_commande,
site_livraison,
famille_article,
modele_article) art,
(SELECT cle_commande,
no_commande
FROM commande
WHERE e_operation = 'Rédac-CV' AND
champ_libre_4 = 'M-PARC' AND
validation_anpe like 'F%i' AND
validation_emetteur LIKE 'V%') cde
WHERE art.no_commande = cde.no_commande AND
famille_article = 'Livraison' AND
modele_article <> 'Livraison de 1 à 4 éléments') livrai,
(SELECT site,
SUM (nb) nb_imp
FROM (SELECT site,
modele_article,
COUNT (cle_materiel) nb
FROM (SELECT *
FROM materiel
WHERE statut IN ('En fonction', 'En panne' ) AND
type_article = 'Imprimante' AND
champ_libre_5 = 'Rédac_cv')
GROUP BY site,
modele_article)
GROUP BY site) mat
WHERE enlev.site = mat.site(+) AND
instal.site(+) = mat.site AND
livrai.site(+) = mat.site
ORDER BY enlev.no_commande,
enlev.site) pasbon,
(SELECT detail.no_commande,
detail.site_livraison,
detail.total - DECODE (cout.qte, NULL, '0', cout.qte) commentaire
FROM (SELECT no_commande,
site_livraison,
SUM (qte_commandee) total
FROM artiacom
WHERE ( modele_article LIKE 'Imp%' AND sous_famille_article = 'Imprimante' ) OR (modele_article = 'Livraison de 1 à 4 éléments' AND
sous_famille_article = 'Eléments isolés')
GROUP BY no_commande, site_livraison) detail,
(SELECT no_commande,
site_livraison,
modele_article,
qte_commandee qte
FROM artiacom
WHERE ( modele_article LIKE '%imprimantes' AND
sous_famille_article = 'Imprimante' OR (modele_article LIKE 'Imp Rédac-CV' AND
sous_famille_article = 'Elément de réseau local')) cout
WHERE detail.no_commande = cout.no_commande(+) AND
detail.site_livraison = cout.site_livraison(+)) vérif_cout
WHERE pasbon.verif_qte > 0 AND
pasbon.no_commande = vérif_cout.no_commande(+) AND
pasbon.site = vérif_cout.site_livraison(+)
UNION
SELECT ok.no_commande,
ok.site,
ok.enlevement,
ok.installation,
ok.livraison,
ok.nb_imp,
ROUND (ok.verif_qte) qte,
'Restera : ' || ABS (ok.verif_qte) remarque,
DECODE (commentaire, '0', 'OK', 'Pb sur la ligne de cout') coût
FROM (SELECT DISTINCT enlev.no_commande,
enlev.site,
enlev.qte enlevement,
instal.qte installation,
livrai.qte livraison,
mat.nb_imp,
enlev.qte - DECODE (mat.nb_imp, NULL, '0', mat.nb_imp) verif_qte
FROM (SELECT cde.no_commande,
site, art.famille_article,
art.modele_article,
art.qte
FROM (SELECT no_commande,
site_livraison site,
famille_article,
modele_article,
SUM (qte_commandee) qte
FROM artiacom
GROUP BY no_commande,
site_livraison,
famille_article,
modele_article) art,
(SELECT cle_commande,
no_commande
FROM commande
WHERE e_operation = 'Rédac-CV' AND
champ_libre_4 = 'M-PARC' AND
validation_anpe like 'F%i' AND
validation_emetteur LIKE 'V%') cde
WHERE art.no_commande = cde.no_commande AND
famille_article = 'Enlèvement') enlev,
(SELECT cde.no_commande,
site,
art.famille_article,
art.modele_article,
art.qte
FROM (SELECT no_commande,
site_livraison site,
famille_article,
modele_article,
SUM (qte_commandee) qte
FROM artiacom
GROUP BY no_commande,
site_livraison,
famille_article,
modele_article) art,
(SELECT cle_commande,
no_commande
FROM commande
WHERE e_operation = 'Rédac-CV' AND
validation_anpe like 'F%i' AND
validation_emetteur LIKE 'V%') cde
WHERE art.no_commande = cde.no_commande AND
famille_article IN ('Installation', 'Intégration') AND
modele_article <> '1 à 5 imprimantes' AND
modele_article <> '6 et plus imprimantes') instal,
(SELECT cde.no_commande,
site,
art.famille_article,
art.modele_article,
art.qte
FROM (SELECT no_commande,
site_livraison site,
famille_article,
modele_article,
SUM (qte_commandee) qte
FROM artiacom
GROUP BY no_commande,
site_livraison,
famille_article,
modele_article) art,
(SELECT cle_commande,
no_commande
FROM commande
WHERE e_operation = 'Rédac-CV' AND
champ_libre_4 = 'M-PARC' AND
validation_anpe like 'F%i' AND
validation_emetteur LIKE 'V%') cde
WHERE art.no_commande = cde.no_commande AND
famille_article = 'Livraison' AND
modele_article <> 'Livraison de 1 à 4 éléments') livrai,
(SELECT site,
SUM (nb) nb_imp
FROM (SELECT site,
modele_article,
COUNT (cle_materiel) nb
FROM (SELECT *
FROM materiel
WHERE statut IN ('En fonction', 'En panne') AND
type_article = 'Imprimante' AND
champ_libre_5 = 'Rédac_cv')
GROUP BY site, modele_article)
GROUP BY site) mat
WHERE enlev.site = mat.site(+) AND
instal.site(+) = mat.site AND
livrai.site(+) = mat.site
ORDER BY enlev.no_commande, enlev.site) ok,
(SELECT detail.no_commande,
detail.site_livraison,
detail.total - DECODE (cout.qte, NULL, '0', cout.qte) commentaire
FROM (SELECT no_commande,
site_livraison,
SUM (qte_commandee) total
FROM artiacom
WHERE ( modele_article LIKE 'Imp%' AND
sous_famille_article = 'Imprimante') OR (modele_article = 'Livraison de 1 à 4 éléments' AND
sous_famille_article = 'Eléments isolés')
GROUP BY no_commande, site_livraison) detail,
(SELECT no_commande,
site_livraison,
modele_article,
qte_commandee qte
FROM artiacom
WHERE (modele_article LIKE '%imprimantes' AND
sous_famille_article = 'Imprimante') OR (modele_article LIKE 'Imp Rédac-CV' AND sous_famille_article = 'Elément de réseau local' )) cout
WHERE detail.no_commande = cout.no_commande(+) AND
detail.site_livraison = cout.site_livraison(+)) vérif_cout
WHERE ok.verif_qte < 0 AND
ok.no_commande = vérif_cout.no_commande(+) AND
ok.site = vérif_cout.site_livraison(+)
UNION
SELECT ok.no_commande,
ok.site,
ok.enlevement,
ok.installation,
ok.livraison,
ok.nb_imp,
ROUND (ok.verif_qte) qte,
'Plus d''imprimante' remarque,
DECODE (commentaire, '0', 'OK', 'Pb sur la ligne de cout') coût
FROM (SELECT DISTINCT enlev.no_commande,
enlev.site,
enlev.qte enlevement,
instal.qte installation,
livrai.qte livraison,
mat.nb_imp,
enlev.qte - DECODE (mat.nb_imp, NULL, '0', mat.nb_imp) verif_qte
FROM (SELECT cde.no_commande,
site,
art.famille_article,
art.modele_article, art.qte
FROM (SELECT no_commande,
site_livraison site,
famille_article,
modele_article,
SUM (qte_commandee) qte
FROM artiacom
GROUP BY no_commande,
site_livraison,
famille_article,
modele_article) art,
(SELECT cle_commande,
no_commande
FROM commande
WHERE e_operation = 'Rédac-CV' AND
champ_libre_4 = 'M-PARC' AND
validation_anpe like 'F%i' AND
validation_emetteur LIKE 'V%') cde
WHERE art.no_commande = cde.no_commande AND
famille_article = 'Enlèvement') enlev,
(SELECT cde.no_commande,
site,
art.famille_article,
art.modele_article, art.qte
FROM (SELECT no_commande,
site_livraison site,
famille_article,
modele_article,
SUM (qte_commandee) qte
FROM artiacom
GROUP BY no_commande,
site_livraison,
famille_article,
modele_article) art,
(SELECT cle_commande,
no_commande
FROM commande
WHERE e_operation = 'Rédac-CV' AND
champ_libre_4 = 'M-PARC' AND
validation_anpe like 'F%i' AND
validation_emetteur LIKE 'V%') cde
WHERE art.no_commande = cde.no_commande AND
famille_article IN ('Installation', 'Intégration') AND
modele_article <> '1 à 5 imprimantes' AND
modele_article <> '6 et plus imprimantes') instal,
(SELECT cde.no_commande, site, art.famille_article,
art.modele_article, art.qte
FROM (SELECT no_commande,
site_livraison site,
famille_article,
modele_article,
SUM (qte_commandee) qte
FROM artiacom
GROUP BY no_commande,
site_livraison,
famille_article,
modele_article) art,
(SELECT cle_commande,
no_commande
FROM commande
WHERE e_operation = 'Rédac-CV' AND
champ_libre_4 = 'M-PARC' AND
validation_anpe like 'F%i' AND
validation_emetteur LIKE 'V%') cde
WHERE art.no_commande = cde.no_commande AND
famille_article = 'Livraison' AND
modele_article <> 'Livraison de 1 à 4 éléments') livrai,
(SELECT site,
SUM (nb) nb_imp
FROM (SELECT site, modele_article,
COUNT (cle_materiel) nb
FROM (SELECT *
FROM materiel
WHERE statut IN ('En fonction', 'En panne' AND
type_article = 'Imprimante' AND
champ_libre_5 = 'Rédac_cv')
GROUP BY site, modele_article)
GROUP BY site) mat
WHERE enlev.site = mat.site(+) AND
instal.site(+) = mat.site AND
livrai.site(+) = mat.site
ORDER BY enlev.no_commande, enlev.site) ok,
(SELECT detail.no_commande,
detail.site_livraison,
detail.total - DECODE (cout.qte, NULL, '0', cout.qte) commentaire
FROM (SELECT no_commande,
site_livraison,
SUM (qte_commandee) total
FROM artiacom
WHERE ( modele_article LIKE 'Imp%' AND sous_famille_article = 'Imprimante') OR (modele_article = 'Livraison de 1 à 4 éléments' AND sous_famille_article = 'Eléments isolés')
GROUP BY no_commande, site_livraison) detail,
(SELECT no_commande,
site_livraison, modele_article,
qte_commandee qte
FROM artiacom
WHERE (modele_article LIKE '%imprimantes' AND
sous_famille_article = 'Imprimante') OR (modele_article LIKE 'Imp Rédac-CV' AND sous_famille_article = 'Elément de réseau local')) cout
WHERE detail.no_commande = cout.no_commande(+) AND
detail.site_livraison = cout.site_livraison(+)) vérif_cout
WHERE ok.verif_qte = 0 AND
ok.no_commande = vérif_cout.no_commande(+) AND
ok.site = vérif_cout.site_livraison(+)
deagle67
MON DIEU !! quoi.gif

bonne chance mec.. peux pas t'aider là..
Nicholas
Ouais, puis vu que c'est bourré de Union et de Group By, le moindre truc que tu touches, ça fait tout pêter bigyellow.gif
Au final, évidemment, mon référant fonctionnel qui pourrait (peut-être) m'éclairer sur ce que doit rendre cette requête est pas là. colere.gif

J'suis sûr que y'a moyen de faire mieux, mais faut reprendre à zéro.
Temet_Nosce
Y a vraiment des bourrins pinaise!
musicos
Il est évident qu'une requête pareille ne s'optimise pas mais se réécrit de A à Z...

Ça ressemble furieusement à un truc qui a été modifié au fur et à mesure des demandes et qui n'a donc pas fait l'objet d'une analyse préalable sur un véritable cahier des charges.

Ne connaissant rien de vos conditions de travail, il est difficile d'établir clairement les responsabilités des uns et des autres...

Donc reste à savoir ce que les utilisateurs attendent vraiment et repartir sur des bases saines.
Antoine
Moi je fais que dans l'injection SQL...

bigyellow.gif
Nicholas
De toute façon, 90% du code était fait pour calculer une des données à afficher. Bordélique au possible en SQL. Donc ça y est, j'ai joué les évangélisateurs, et ils ont maintenant des vues et des procédures et fonctions stockées à l'ANPE bigyellow.gif
Du coup, la requête fait 15 lignes à tout casser. Gros désavantage, maintenant, dès qu'il y a une question sur Oracle, c'est pour ma gueule.
musicos
Ô Racle, Ô désespoir...
Oracle est à la Base de données ce que le VHS est à la vidéo...
Pas le meilleur, mais le plus utilisé.
Nicholas
Bah j'suis pas d'accord... Personnellement, j'ai pas encore bossé sur quelque chose de mieux qu'Oracle. Bon, Access, j'en parle même pas. MySQL, pas de soucis pour les petites applis, mais ça devient compliqué pour une gestion chiadée des droits avec plein d'utilisateurs. DB2, quand t'as pas de mainframe, c'est pas tiptop. Jamais bossé avec par contre. SQL Server, j'aime pas du tout. J'ai l'impression de rien contrôler (les joies de l'administration-clicodrôme...). Puis y'a pas de rollback bigyellow.gif
Enfin c'est sûrement parce que je maîtrise plus Oracle que les autres, mais bon...
Ceci est une version "bas débit" de notre forum. Pour voir la version complète avec plus d'informations, la mise en page et les images, veuillez cliquer ici.