[Oracle] problème de nvl

Résolu/Fermé
AssassinTourist Messages postés 5710 Date d'inscription lundi 16 janvier 2012 Statut Contributeur Dernière intervention 29 février 2024 - 21 mai 2012 à 14:42
AssassinTourist Messages postés 5710 Date d'inscription lundi 16 janvier 2012 Statut Contributeur Dernière intervention 29 février 2024 - 22 mai 2012 à 09:45
Bonjour à tous !

J'ai un problème concernant la requête NVL sous Oracle. Le truc, c'est que j'ai un id, mais qui pourrait être dans deux tables table1 ou table2 et globalement je fais ma requête comme ceci :

select distinct nvl(t1.id, t2.id) ID, nvl(t1.nom, t2.nom) NOM
from table1 t1, table2 t2
where (t1.id = id_donne or t2.id = id_donne)


Si jamais l'id_donne est dans la table1, il n'y a pas de problème. Si par contre, mon id_donne se trouve dans table2, j'ai ID qui est bon, mais j'ai NOM qui reprend toutes les valeurs qui sont dans table1 !

Alors est-ce impossible en une seule requête ? Ma syntaxe est-elle mauvaise ? Y a-t-il d'autres commandes qui permettent de faire ce que je veux ? Ou bien suis-je obligé de passer par deux requêtes, la première vérifiant dans quelle table se trouve l'id_donne avec un count(*) ?

Merci beaucoup !


A voir également:

2 réponses

jee pee Messages postés 40470 Date d'inscription mercredi 2 mai 2007 Statut Modérateur Dernière intervention 23 novembre 2024 9 426
21 mai 2012 à 18:34
Salut,

Tu pourrais essayer :

select distinct id, nom from
(select id, nom from table1 where id=id_donne
union
select id, nom from table2 where id=id_donne
)
/

cdlt
0
AssassinTourist Messages postés 5710 Date d'inscription lundi 16 janvier 2012 Statut Contributeur Dernière intervention 29 février 2024 1 311
21 mai 2012 à 20:39
Vu que je travaille en PL/SQL, je profite de cette commande pour mettre les valeurs trouvées dans des variables locales.

Je vais donc tester :
select distinct id, nom 
into var_id, var_nom
from (
  select id, nom from table1 where id=id_donne
  union
  select id, nom from table2 where id=id_donne
) 

C'est une bonne idée ! Je reviens dire si ça a pu fonctionner dès que je peux.

M'enfin, je ne comprends pas bien alors la fonction NVL :$ et pourquoi elle retourne ces résultats...
0
jee pee Messages postés 40470 Date d'inscription mercredi 2 mai 2007 Statut Modérateur Dernière intervention 23 novembre 2024 9 426
Modifié par jee pee le 21/05/2012 à 23:37
Pour moi ta requête n'a aucun sens.

NVL est utilisé pour remplacer la valeur d'un champ vide, mais sur un enregistrement existant. Tu sembles l'utiliser sur des champs d'un enregistrement qui n'existerait pas.

En plus sans lien entre les 2 tables ta requête génère un produit cartésien des enregistrements entre table 1 et table 2.

Il y a plusieurs autres façons de faire, pour par exemple supprimer le distinct

select id, nom from table1 where id=id_donne
union
select id, nom from table2 where id=id_donne
and id not in (select id from table1 where id=id_donne )
0
AssassinTourist Messages postés 5710 Date d'inscription lundi 16 janvier 2012 Statut Contributeur Dernière intervention 29 février 2024 1 311
Modifié par AssassinTourist le 22/05/2012 à 09:19
Oh d'accord !
Mais n'est-il pas mieux de mettre un distinct plutôt que de faire trois select ?

(dans mon cas présent, j'avais mis un distinct parce qu'avec le nvl, il me donnait trop de résultats même lorsque la requête était bonne)
0
AssassinTourist Messages postés 5710 Date d'inscription lundi 16 janvier 2012 Statut Contributeur Dernière intervention 29 février 2024 1 311
22 mai 2012 à 09:45
Sinon ça marche nickel, jee pee. Merci beaucoup !
0