|
| 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 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. |
| |
| |
| | | |
|
| | | | |
| | |
|