Bonjour à tous,
L'intitulé du sujet n'est pas très clair, mais j'espère que cela deviendra plus compréhensible avec l'explication qui va suivre.
Je galère un peu sur une requête SQL.
J'ai 5 tables :
- Cable (id_cable)
- Cable_patch(id_cable, id_chambre, id_boite))
- cassette (id_cassette, id_chambre)
- tiroir (id_tiroir, id_boite)
- Position (id_position,id_tiroir, id_cassette)
Et voici ma requête :
Cette requête est divisée en 2 "sous-requête", nommée F3 et F4.
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 SELECT cable.id_cable AS id_cable, COALESCE (F3.nb_fibre3, 0) AS nb_position_cassette, COALESCE ( F4.nb_fibre4,0) AS nb_position_boite FROM cable LEFT JOIN ( SELECT cable.id_cable, COUNT(*) nb_fibre3 FROM cable INNER JOIN cable_patch ON cable.id_cable = cable_patch.id_cable LEFT JOIN cassette ON cable_patch.id_chambre = cassette.id_chambre LEFT JOIN position ON cassette.id_cassette = position.id_cassette GROUP BY cable.id_cable ) F3 ON cable.id_cable = F3.id_cable LEFT JOIN ( SELECT cable.id_cable, COUNT (*) nb_fibre4 FROM cable INNER JOIN cable_patch ON cable.id_cable = cable_patch.id_cable LEFT JOIN tiroir ON cable_patch.id_boite = t_tiroir.id_boite LEFT JOIN position ON t_tiroir.id_tiroir = position.id_tiroir GROUP BY cable.id_cable ) F4 ON cable.id_cable = F4.id_cable
La requête F3 va me donner, pour chaque câble, le nombre de "position" possédant un "id_cassette" (en passant par plusieurs jointures : cable vers cable_patch, cable_patch vers cassette, et cassette vers position)
La requête F4 va me donner, pour chaque câble, le nombre de "position" possédant un "id_tiroir" (en passant par plusieurs jointures : cable vers cable_patch, cable_patch vers tiroir, et tiroir vers position)
Du coup, le résultat de ma requête ressemblera à quelque chose comme ça :
Ce que j'aimerais faire, c'est donc résumer les champs "chambre_positif" et "boite_positif" en une seule colonne :
Chaque câble ne peut pas avoir à la fois des positions possédant un "id_cassette" et un "id_tiroir". Et pour savoir si un câble va avoir des positions possédant un "id_cassette" ou bien un "id_tiroir", il faut aller voir la table "cable_patch".
Cette table comporte les identifiants de chaque câbles, ainsi que les champs "id_chambre" et "id_boite".
A partir de là, il n'y a que 2 possibilités :
- si, dans la table "cable_patch", un câble possède une valeur "id_chambre", ce câble aura des positions de type "id_cassette" que l'on peut récupérer avec les jointures présentes dans ma requête F3.
- si, dans la table "cable_patch", un câble possède une valeur "id_boite", ce câble aura des positions de type "id_tiroir" que l'on peut récupérer avec les jointures présentes dans ma requête F4.
J'aimerais donc avoir une seule colonne qui me donnerait, pour chaque câble, le nombre de "position" de type "id_cassette" (en allant donc voir si ce câble possède une valeur "id_chambre" dans la table "cable_patch")
OU
qui me donnerait, pour un câble ne possédant aucune valeur "id_chambre" dans "cable_patch", le nombre de "position" de type "id_tiroir" (en allant donc voir si ce câble possède une valeur "id_boite" dans la table "cable_patch").
J'espère que toutes ces explications ne sont pas trop longue et/ou trop compliquées. Pour résumé, j'aimerais juste transformer mes 2 "sous-requêtes" F3 et F4 qui me donnent deux champs différents en une seule requête qui me donnerait un seul champs.
Merci d'avance à ceux qui me liront, et n'hésitez pas à me dire si mon problème n'est pas suffisamment clair
Partager