Bonjour à tous,

J'ai une requête un peu mortelle à faire, et je crois que je n'en ai jamais écrite des comme cela. Je précise que c'est destiné à être lancé une ou deux fois par an pour faire une extraction CSV.
J'explique.
Les premières colonnes (environ 70) sont des colonnes issues d'une table principale (liste d'utilisateurs) et il y a 3 jointures dessus, pour récupérer des infos. Rien de bien méchant jusque là.
Mais c'est là que ça se complique. La requête me ramène environ 75 000 lignes (détail important).

Pour chaque ligne, je dois vérifier si chaque utilisateur possède, ou ne possède pas un logiciel. S'il le possède, je dois mettre 1, sinon 0.
Pour cela, j'ai créé une requête que j'ai déclaré du style :

Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
With REQUETE_B AS (
SELECT col1, col2, col3... FROM table1
LEFT JOIN table2 ON (......)
LEFT JOIN table3 ON (.....)
LEFT JOIN table4 ON (......)
LEFT JOIN table5 ON (.....)
LEFT JOIN table6 ON (......)
LEFT JOIN table7 ON (.....)
)
Et donc, à la suite des 70 champs de la première requête, je mets une requête du genre :

Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
(
SELECT COUNT(1) FROM REQUETE_B b
JOIN tableN N ON (.......)
WHERE condition pour logiciel A
) AS "col71",
Et puisque j'ai 56 logiciel, et bien ça fait 56 nouvelles colonnes ajoutées à la toute première requête.

En comptant rapidement, étant donné que j'ai environ 75 000 lignes, ça fait 56 x 75 000 = 4 200 000 requêtes lancées.

C'est assez énorme. Et avec déjà 1 ou 2 logiciel c'est très très long pour obtenir le résultat.

On m'a parlé de requête croisée. Mais je ne sais pas du tout ce que c'est.

Quelqu'un aurait une idée qui me permettrait d'optimiser tout ça ?

Merci

Michel