PC SOFT

FOROS PROFESIONALES
WINDEVWEBDEV y WINDEV Mobile

Inicio → WINDEV 2025 → Requête sql
Requête sql
Iniciado por cecile.aliaga, 03,abr. 2020 16:07 - 2 respuestas
Publicado el 03,abril 2020 - 16:07
Bonjour à tous,
J'ai un problème pour sortir les données dont j'ai besoin de ma base. Voici la configuration de ma table assez simple.




J'ai besoin de pouvoir récupérer toutes les identifications des IDP existants dans P. L'IDV est un paramètre.
Ma requête actuelle est la suivante :
SELECT
P.IDP AS IDP,
P_V.IDV AS IDV,
P.Libelle AS Libelle,
(CASE WHEN (Identification IS NULL)
THEN (SELECT Parametre.Valeur FROM Parametre WHERE Parametre.MotCle = 'DÉFAUT')
ELSE Identification
END) AS Identification //récupération d'une valeur par défaut si NULL
FROM
P LEFT JOIN P_V ON P.IDP = P_V.IDP
WHERE
P.EstVisible = 1
AND
(
P_V.IDV = {pV}
OR
P_V.IDV IS NULL //V n'existe pas pour la valeur P dans la TABLE P_V
)


SI IDV existe dans P_V alors je récupère bien les infos souhaitées.
Seulement si IDV n'existe pas avec cette requête je ne récupère que les valeurs où IDV est NULL et il me manque ainsi un P.
N'étant pas sur d’être clair je met un exemple avec des données.

Ma table P_V :
IDP | IDV | Identification
1 | 1 | ident1.1
1 | 2 | ident1.2
1 | 3 | ident1.3

Ma table P :
IDP | Libelle | EstVisible
1 | Test1 | 1
2 | Test2 | 1
3 | Test3 | 1
4 | Test4 | 0

Le résultat de ma requête actuelle si IDV existe (IDV = 1) dans P_V :
IDP | IDV | Libelle | Identification
1 | 1 | Test1 | ident1.1
2 | NULL | Test2 | NULL
3 | NULL | Test3 | NULL

OK si IDV existe.

Le résultat de ma requête actuelle si IDV n'existe pas (IDV = 32) dans P_V :
IDP | IDV | Libelle | Identification
2 | NULL | Test2 | NULL
3 | NULL | Test3 | NULL

Résultat souhaité si IDV n'existe pas :
IDP | IDV | Libelle | Identification
1 | NULL | Test1 | NULL
2 | NULL | Test2 | NULL
3 | NULL | Test3 | NULL

Merci,
Miembro registrado
499 mensajes
Publicado el 03,abril 2020 - 17:25
Bonjour,

En insérant la condition sur P_V.IDV, dans le WHERE, vous obligez le moteur à faire la vérification après que la jointure soit faite. Si vous enlevez la condition du WHERE et exécutez à nouveau la requête vous comprendrez pourquoi elle ne fonctionne pas : pour IDP = 1, il y a bien un enregistrement trouvé dans P_V, avec IDV=1, qui ne correspond ni à 32, ni à NULL, c'est pourquoi la ligne ne ressort pas dans les résultats.

Il faut donc empêcher la jointure de se faire en mettant votre condition d'existence dans P_V dans le ON de la jointure plutôt que dans le WHERE. Une fois cela fait, le "OR ... IS NULL" n'est même plus nécessaire, puisqu'on est dans le cas d'une jointure LEFT.

SELECT
P.IDP AS IDP,
P_V.IDV AS IDV,
P.Libelle AS Libelle,
COALESCE(Identification, 'Défaut') AS identification
FROM
P
LEFT JOIN P_V
ON P.IDP = P_V.IDP
AND P_V.IDV = 32 -- < IDV qui n'existe pas
WHERE
P.EstVisible = 1


Un exemple est visible ici : http://sqlfiddle.com/…
Publicado el 06,abril 2020 - 08:48
Merci,
je ne savais pas qu'il était possible de donner les paramètres directement dans une jointure.
Cela règle parfaitement mon problème.

J'ai repris le COALESCE à la place du CASE qui me semble plus adapté aussi.

Merci encore.