OVH Cloud OVH Cloud

Requête SQL complexe

2 réponses
Avatar
Gilles TOURREAU
Bonjour tout le monde !

Voilà, j'ai une table Parent et 4 tables Enfants (Enfant1, ...etc)
Toutes les tables enfants sont reliées à la table parent avec un
identifiant IdParent.

Je voudrais avoir pour chaque enregistrement Parent :

- Le contenu de l'enregistrement parent
- 4 booléens qui indiquent si oui ou non il existe au moins un
enregistrement dans une table enfant.

Du style :

IdParent | RubParent1 | RubParentN | ExisteEnfant1 | ExisteEnfantN
4 BLABLA TITI Oui Non
21245 TOTO BIBI Oui Oui

L'idéal, ca serait le tout en une requête SQL...
Le best ca serait une requête SQL normalisé indépendante de la base de
données, car cette requête risque d'être executée dans différents type
de base de données...

En vous remerciant par avance de vos lumières...


--
Gilles TOURREAU
Responsable informatique
gilles.tourreau@pos.fr

Société P.O.S
Spécialiste en motoculture depuis + de 30 ans !
http://www.pos.fr

2 réponses

Avatar
Christian Robert
Bonjour,

Par exemple

SELECT *,
EXISTS(SELECT *
FROM TableEnfant1
WHERE TableParent.IdParent = TableEnfant1.IdParent ) AS
ExisteEnfant1 ,
EXISTS(SELECT *
FROM TableEnfant2
WHERE TableParent.IdParent = TableEnfant2.IdParent ) AS
ExisteEnfant2,
...
FROM TableParent

Il y a d'autres manière possible, mais c'est la première qui m'est venue à
l'esprit.

--
Cordialement,
Christian Robert http://blogs.developpeur.org/christian/
MCT - Database Development / Database Administration


"Gilles TOURREAU" a écrit :

Bonjour tout le monde !

Voilà, j'ai une table Parent et 4 tables Enfants (Enfant1, ...etc)
Toutes les tables enfants sont reliées à la table parent avec un
identifiant IdParent.

Je voudrais avoir pour chaque enregistrement Parent :

- Le contenu de l'enregistrement parent
- 4 booléens qui indiquent si oui ou non il existe au moins un
enregistrement dans une table enfant.

Du style :

IdParent | RubParent1 | RubParentN | ExisteEnfant1 | ExisteEnfantN
4 BLABLA TITI Oui Non
21245 TOTO BIBI Oui Oui

L'idéal, ca serait le tout en une requête SQL...
Le best ca serait une requête SQL normalisé indépendante de la base de
données, car cette requête risque d'être executée dans différents type
de base de données...

En vous remerciant par avance de vos lumières...


--
Gilles TOURREAU
Responsable informatique


Société P.O.S
Spécialiste en motoculture depuis + de 30 ans !
http://www.pos.fr





Avatar
SQLpro
La solution :

Exemple :

CREATE TABLE T_VEHICULE_VHC
(VHC_ID INT NOT NULL PRIMARY KEY IDENTITY,
VHC_NOM VARCHAR(32))

INSERT INTO T_VEHICULE_VHC VALUES ('AIRBUS A320')
INSERT INTO T_VEHICULE_VHC VALUES ('LA CAPLYPSO')
INSERT INTO T_VEHICULE_VHC VALUES ('VOLVO D2800')
INSERT INTO T_VEHICULE_VHC VALUES ('BOEING 747B')
INSERT INTO T_VEHICULE_VHC VALUES ('LE TITANICK')
INSERT INTO T_VEHICULE_VHC VALUES ('DODGE VF512')

CREATE TABLE T_AVION_AVN
(VHC_ID INT NOT NULL PRIMARY KEY,
AVN_CAPACITE INT,
AVN_RAYON_ACTION INT)

INSERT INTO T_AVION_AVN VALUES (1, 120, 2400)
INSERT INTO T_AVION_AVN VALUES (4, 300, 7200)

CREATE TABLE T_BATEAU_BTO
(VHC_ID INT NOT NULL PRIMARY KEY,
BTO_TIRANT_EAU INT)

INSERT INTO T_BATEAU_BTO VALUES (2, 60)
INSERT INTO T_BATEAU_BTO VALUES (5, 2541)

CREATE TABLE T_CAMION_CMN
(VHC_ID INT NOT NULL PRIMARY KEY,
CMN_TONNAGE INT)

INSERT INTO T_CAMION_CMN VALUES (3, 38)
INSERT INTO T_CAMION_CMN VALUES (6, 22)

SELECT VHC.*,
CASE
WHEN AVN.VHC_ID IS NULL THEN 'NON'
ELSE 'OUI'
END AS AVION,
CASE
WHEN BTO.VHC_ID IS NULL THEN 'NON'
ELSE 'OUI'
END AS BATEAU,
CASE
WHEN CMN.VHC_ID IS NULL THEN 'NON'
ELSE 'OUI'
END AS CAMION
FROM T_VEHICULE_VHC AS VHC
LEFT OUTER JOIN T_AVION_AVN AS AVN
ON VHC.VHC_ID = AVN.VHC_ID
LEFT OUTER JOIN T_BATEAU_BTO AS BTO
ON VHC.VHC_ID = BTO.VHC_ID
LEFT OUTER JOIN T_CAMION_CMN AS CMN
ON VHC.VHC_ID = CMN.VHC_ID

VHC_ID VHC_NOM AVION BATEAU CAMION
----------- -------------------------------- ----- ------ ------
1 AIRBUS A320 OUI NON NON
2 LA CAPLYPSO NON OUI NON
3 VOLVO D2800 NON NON OUI
4 BOEING 747B OUI NON NON
5 LE TITANICK NON OUI NON
6 DODGE VF512 NON NON OUI



--
Frédéric BROUARD, MVP SQL Server, expert bases de données et langage SQL
Le site sur le langage SQL et les SGBDR : http://sqlpro.developpez.com
Audit, conseil, expertise, formation, modélisation, tuning, optimisation
********************* http://www.datasapiens.com ***********************


"Gilles TOURREAU" a écrit :

Bonjour tout le monde !

Voilà, j'ai une table Parent et 4 tables Enfants (Enfant1, ...etc)
Toutes les tables enfants sont reliées à la table parent avec un
identifiant IdParent.

Je voudrais avoir pour chaque enregistrement Parent :

- Le contenu de l'enregistrement parent
- 4 booléens qui indiquent si oui ou non il existe au moins un
enregistrement dans une table enfant.

Du style :

IdParent | RubParent1 | RubParentN | ExisteEnfant1 | ExisteEnfantN
4 BLABLA TITI Oui Non
21245 TOTO BIBI Oui Oui

L'idéal, ca serait le tout en une requête SQL...
Le best ca serait une requête SQL normalisé indépendante de la base de
données, car cette requête risque d'être executée dans différents type
de base de données...

En vous remerciant par avance de vos lumières...


--
Gilles TOURREAU
Responsable informatique


Société P.O.S
Spécialiste en motoculture depuis + de 30 ans !
http://www.pos.fr