[Résolu] Requêtes imbriquées

Discussions sur le module de base de données Base et plus particulièrement sur le langage SQL ou sur les connexions aux SGBD tiers.
Les questions sur les macros doivent être postées dans la section dédiée en dessous.

Modérateur : Vilains modOOs

Règles du forum
Cette section est dédiée au module Base et plus particulièrement sur le langage SQL ou sur les connexions aux SGBD tiers. Vous ne devez pas poster ici de questions sur les macros mais utiliser la section éponyme.
Pour accélérer les réponses, vous pouvez mettre en ligne votre base en joignant un fichier ODB : comment faire.
sebmdp
Membre hOOnoraire
Membre hOOnoraire
Messages : 125
Inscription : 08 juil. 2008 16:31
Localisation : Orleans / France

[Résolu] Requêtes imbriquées

Message par sebmdp »

Bonjour à toutes & tous,

Je cherche à imbriquer 2 SELECT dans une requête afin de conditionner l'affichage d'un champ d'une des 2 tables ("T_Clients"."OrgQualite") sur la valeur d'un autre ("T_Mailing"."IDAdCor") ; Les 2 tables sont liées sur l'IDClient.
Lorsque le champ "IDAdCor" a pour valeur '2' la valeur du champ "OrgQualite" doit être affichée & inversement.
J'ai donc essayé (requête 3) :

Code : Tout sélectionner

SELECT "T_Mailing"."IDMailing", "T_Mailing"."IDAdCor", "T_Clients"."OrgQualite", "T_Clients"."Nom", "T_Clients"."Prenom" FROM "T_Clients" AS "T_Clients", "T_Mailing" AS "T_Mailing" WHERE "T_Clients"."IDid" = "T_Mailing"."IDClientCor" AND "T_Clients"."OrgQualite" = (SELECT "OrgQualite" FROM "T_Clients" WHERE "T_Mailing"."IDAdCor" = '2')
Mais j'obtiens un message d'erreur.

Je suis arrivé au résultat voulu en essayant ceci (requête 2) :

Code : Tout sélectionner

SELECT "T_Mailing"."IDMailing", "T_Mailing"."IDAdCor", "T_Clients"."Nom", "T_Clients"."Prenom", "T_Clients_1"."OrgQualite" FROM { OJ "T_Mailing" AS "T_Mailing" LEFT OUTER JOIN "T_Clients" AS "T_Clients_1" ON "T_Mailing"."IDClientCor" = "T_Clients_1"."IDid" AND "T_Mailing"."IDAdCor" = '2' }, "T_Clients" AS "T_Clients" WHERE "T_Mailing"."IDClientCor" = "T_Clients"."IDid"
Ma question est : puis-je arriver au même résultat en simplifiant le code de la requête, sachant que celle-ci doit afficher non seulement les champs "IDAdCor" ayant pour valeur '2' mais aussi ceux égales à '0' & '1'.

Par avance merci.
Salutations.
Vous ne pouvez pas consulter les pièces jointes insérées à ce message.
Dernière modification par sebmdp le 11 août 2009 17:28, modifié 2 fois.
Open Office 3.2.1
Mac OS 10.5.8
Avatar de l’utilisateur
jeanmimi
Grand Maître de l'OOffice
Grand Maître de l'OOffice
Messages : 17219
Inscription : 03 mars 2006 16:02
Localisation : Venise verte

Re: Requêtes imbriquées

Message par jeanmimi »

Bonjour,
La Requête3 avec ce code répond-t-elle à ta question :

Code : Tout sélectionner

SELECT "T_Mailing"."IDMailing", "T_Mailing"."IDAdCor", "T_Clients"."OrgQualite", "T_Clients"."Nom", "T_Clients"."Prenom" FROM "T_Clients" AS "T_Clients", "T_Mailing" AS "T_Mailing" WHERE "T_Clients"."IDid" = "T_Mailing"."IDClientCor" AND ( "T_Mailing"."IDAdCor" = 2 OR "T_Mailing"."IDAdCor" = 1 OR "T_Mailing"."IDAdCor" = 3 ) ORDER BY "T_Mailing"."IDAdCor" ASC
LibreOffice : Version : 25.8.4 (x64)(23 février 2026)
Adoptium JRE ou Oracle JRE (x64), Windows 10, Thunderbird, Firefox
sebmdp
Membre hOOnoraire
Membre hOOnoraire
Messages : 125
Inscription : 08 juil. 2008 16:31
Localisation : Orleans / France

Re: Requêtes imbriquées

Message par sebmdp »

Bonjour,

Merci pour cette aide, mais cela ne répond pas à mon problème car quelque soit la valeur du champ "IDAdCor", le champ "OrgQualite" apparaît dans les résultats de la requête. Hors je ne voudrais l'avoir que lorsque le champ "IDAdCor" = 2.

Merci tout de même.
Open Office 3.2.1
Mac OS 10.5.8
Avatar de l’utilisateur
jeanmimi
Grand Maître de l'OOffice
Grand Maître de l'OOffice
Messages : 17219
Inscription : 03 mars 2006 16:02
Localisation : Venise verte

Re: Requêtes imbriquées

Message par jeanmimi »

En ne gardant que le code suivant ?

Code : Tout sélectionner

SELECT "T_Mailing"."IDMailing", "T_Mailing"."IDAdCor", "T_Clients"."OrgQualite", "T_Clients"."Nom", "T_Clients"."Prenom" FROM "T_Clients" AS "T_Clients", "T_Mailing" AS "T_Mailing" WHERE "T_Clients"."IDid" = "T_Mailing"."IDClientCor" AND  "T_Mailing"."IDAdCor" = 2 
LibreOffice : Version : 25.8.4 (x64)(23 février 2026)
Adoptium JRE ou Oracle JRE (x64), Windows 10, Thunderbird, Firefox
sebmdp
Membre hOOnoraire
Membre hOOnoraire
Messages : 125
Inscription : 08 juil. 2008 16:31
Localisation : Orleans / France

Re: Requêtes imbriquées

Message par sebmdp »

Je n'obtiendrais que les clients ayant une "IDAdCor" égale à '2'....

Pour expliquer un peu mieux ce que je cherche à obtenir :
Lorsqu'un Client à pour "IDAdCor" la valeur 2, cela signifie que l'on veut voir apparaître sa fonction dans son entreprise, donc afficher le champ "OrgQualite".
En revanche pour une valeur "IDAdCor" = 1, on cache sa fonction.
La requête doit cependant afficher l'ensemble des enregistrements. C'est la raison pour laquelle j'ai besoin de mettre une condition sur ce champ & donc d'imbriquer 2 requêtes.

Sur le code de la requête 2, qui fonctionne, j'ai "doublé" la liste client afin de pouvoir conditionner l'affichage du champ "OrgQualite" :

Code : Tout sélectionner

... FROM { OJ "T_Mailing" AS "T_Mailing" LEFT OUTER JOIN "T_Clients" AS "T_Clients_1" ON "T_Mailing"."IDClientCor" = "T_Clients_1"."IDid" AND "T_Mailing"."IDAdCor" = '2' } ...
Je me trompe certainement puisque cela ne fonctionne pas, mais je pensais obtenir le même résultat en imbriquant beaucoup plus simplement un SELECT sur le champ "OrgQualite" :

Code : Tout sélectionner

... "T_Clients"."OrgQualite" = ( SELECT "T_Clients"."OrgQualite" FROM "T_Clients" WHERE "T_Mailing"."IDAdCor" = '2' )
Edit 1 :
En fait pour afficher tous les résultats ma requête devrait plutôt ressembler à :

Code : Tout sélectionner

SELECT "T_Mailing"."IDMailing", "T_Mailing"."IDAdCor", "T_Clients"."OrgQualite", "T_Clients"."Nom", "T_Clients"."Prenom", (SELECT "OrgQualite" FROM "T_Clients" WHERE "T_Mailing"."IDAdCor" = '2') FROM "T_Clients" AS "T_Clients", "T_Mailing" AS "T_Mailing" WHERE "T_Clients"."IDid" = "T_Mailing"."IDClientCor"
Mais cela ne fonctionne pas non plus...

Edit 2 :
N'ayant pas de solution pour écrire une seule & unique requête, j'ai donc choisi d'en construire plusieurs & de les regrouper en une seule en les liant avec différentes jointures.

Salutations
Open Office 3.2.1
Mac OS 10.5.8