[Oracle] problème de nvl

Résolu
AssassinTourist Messages postés 6029 Date d'inscription   Statut Contributeur Dernière intervention   -  
AssassinTourist Messages postés 6029 Date d'inscription   Statut Contributeur Dernière intervention   -
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 41521 Date d'inscription   Statut Modérateur Dernière intervention   9 720
 
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 6029 Date d'inscription   Statut Contributeur Dernière intervention   1 312
 
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 41521 Date d'inscription   Statut Modérateur Dernière intervention   9 720
 
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 6029 Date d'inscription   Statut Contributeur Dernière intervention   1 312
 
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 6029 Date d'inscription   Statut Contributeur Dernière intervention   1 312
 
Sinon ça marche nickel, jee pee. Merci beaucoup !
0