Bonjour.

OK, le titre n'est pas éloquent, mais je n'avais rien de plus accrocheur ...

Je vais solliciter votre aide car, pour reprendre une phrase de film célèbre : "J'ai la cervelle en sauce blanche" (Ghostbuster pour les incultes )

J'ai une requête qui m'a demandé quelques nœuds au cerveau :
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
 
SELECT DISTINCT 
	documents.id_document,
	documents.code1,
	documents.code2,
	documents.code3,
	documents.titre,
	documents.indice,
	documents.commentaires,
	documents.fichier_pdf,
	documents.fichier_source,
	documents.nb_affaire,
	etats.etat
FROM
	types 
	INNER JOIN ((((marches INNER JOIN (etats INNER JOIN documents ON etats.id_etat = documents.id_etat)
	ON marches.id_marche = documents.id_marche) LEFT OUTER JOIN mots_clef ON documents.id_document = mots_clef.id_document)
	LEFT OUTER JOIN documents_affaires ON documents.id_document = documents_affaires.id_document) INNER JOIN documents_types
	ON documents.id_document = documents_types.id_document) ON types.id_type = documents_types.id_type
WHERE
	(
		(documents.code1 ILIKE 'Ref1' OR documents.code2 ILIKE 'Ref1' OR documents.code3 ILIKE 'Ref1') --<-param1
		AND
		(documents.titre ILIKE '%' OR documents.commentaires ILIKE '%' OR mots_clef.mot_clef ILIKE '%') --<-param2
		AND
		marches.marche ILIKE '%' --<-param3
	)
	AND
	     -- Si $4 = 0, c'est que la recherche pointe sur <Tous> les types de documents
	     1 = CASE
        		WHEN 0 = 0 THEN 1 --<-param4
		        WHEN types.id_type = 0 THEN 1 --<-param4
		        ELSE 0
	     END
        AND
	      -- Si $6 = 0 c'est que la recherche ne pointe sur aucune affaire
	      1 = CASE
		         WHEN 0 =0 THEN 1 --<-param6
	        	 WHEN documents_affaires.id_affaire = 0 THEN 1 --<-param6
		         ELSE 0
 	      END
ORDER BY code1 ASC;
(Pour être plus précis, il s'agit d'une fonction que j'appelle avec x paramètres. Aussi ne vous formalisez pas des WHEN 0 = 0, il s'agit d'un forçage des paramètres pour ne pas passer par la fonction pour pouvoir faire des tests + rapides sous pgAdmin).
De plus, désolé pour l'indentation, j'avoue que l'essentiel de la requête a été générée par un soft et que j'ai du mal à démêler les jointures.

Petites explications :
J'ai plusieurs tables:
- 'documents' : liste de documents
- 'affaires' (un document peut avoir aucune ou plusieurs affaires, une affaire peut avoir aucun ou plusieurs documents)
- 'types' (un document doit avoir au moins un type, un type peut avoir aucun ou plusieurs document)
- 'etat' (un document doit avoir un seul état, un état peut avoir aucun ou plusieurs documents)
- 'mots_clefs' (un document peut avoir aucun ou plusieurs mots_clef, un mot_clef doit avoir un seul document)
- 'marches' (un document doit avoir un seul marché, un marché peut avoir plusieurs ou aucun document)

Pour lier tout ça, j'ai 2 tables de liens (excusez si le terme est impropre, j'ai pas fais SQL 1ère langue )
- 'documents_affaires'
- 'document_type'

Actuellement, la fonction... fonctionne . Je récupère bien avec ma requête les info qui m'intéressent :
En fonction de divers paramètre(param) , je récupère une liste d'enregistrement (normal me direz-vous).

J'aimerais ajouter une colonne au résultat de la requête correspondant au nombre d'enregistrement ayant l'id_document présents dans la table 'documents_affaires'.

Exemple :
la requete trouve 10 enregistrements, je voudrait que pour chaque enregistrement, elle récupère l'id_document (c'est déjà le cas) et qu'elle aille compter le nombre de lignes qui se trouvent dans la table 'documents_affaires' avec le même id_document.

Je ne pense pas que cela soit très compliqué, une histoire de COUNT(*), mais j'avoue que je sèche. La journée a été longue, c'est peut-être ça ...

Merci de votre aide bienvenue.

PS : j'ai omis de préciser que j'étais newbie en programmation (automaticien à la base), idem en SQL, encore plus en PostgreSQL. Des réponses simples, voir un petit exemple seraient vraiment appréciés si vous voulez pas me perdre trop vite