Oracle - Requête SQL outer join

Oracle - Requête SQL outer join - SQL/NoSQL - Programmation

Marsh Posté le 30-06-2014 à 16:03:59    

Bonjour,
 
 
J'ai 2 tables cli1 (client et adresse principale) et cli2 (adresse secondaires d'un client) et chaque enregistrement de cli2 est lié à 1 enregistrement de cli1.
 
J'ai en gros une requête comme suit :

select * from cli1, outer cli2
 where cli2.id = cli1.id
 order by cli1.id, cli2.adr


 
Cette requête me retourne :
- soit 1 seule ligne avec les données du client principal s'il n'y a pas d'adresse secondaire,
- soit autant de lignes que d'adresses secondaires.
 
Or je voudrais que ma requête me retourne :
- ET la ligne d'adresse principale (infos de cli1 sans enregistrement de cli2 associé)
- ET les lignes d'adresse secondaires.
 
 
 
En résumé, si j'ai un client id=AAA sans adresse secondaire, ça me retourne :

id     adr
AAA


 
Si mon client id=AAA a 3 adresses adr=01 adr=02 et adr=03, j'ai comme résultat :

id    adr
AAA   01
AAA   02
AAA   03


 
et moi je voudrais

id    adr
AAA
AAA   01
AAA   02
AAA   03


 
 
Comment faire svp ?


Message édité par Kirvel le 30-06-2014 à 16:07:41

---------------
MyAnimeList
Reply

Marsh Posté le 30-06-2014 à 16:03:59   

Reply

Marsh Posté le 30-06-2014 à 23:22:30    

C'est facile...  
Relit tes cours, ou cherches un peu , car il doit juste exister justes quelques millions de pages web sur les jointures, et des dizaines sur le forum :)
Si tu ne trouves pas ton bonheur...  
Guillaume


---------------
mieux vaut être un con au chaud, qu'un con gelé lol
Reply

Marsh Posté le 30-06-2014 à 23:44:24    

je ne vois pas en quoi c'est "facile": car pour moi la solution n'est pas seulement dans la jointure. Le pb vient du fait qu'il y a 2 types d'adresse à mettre dans la même colonne de sortie. Hors pour "assembler" 2 jeux de données, il n'y a que le union à ma connaissance.
 
Une variation autour de qq chose ça devrait marcher...

Code :
  1. select * from (select cli1.id, cli1.adr, 0 as rank from cli1 union select cli2.id, cli2.adr, 1 as rank from cli2) all_addresses order by id, rank

Message cité 1 fois
Message édité par dreameddeath le 30-06-2014 à 23:45:07
Reply

Marsh Posté le 01-07-2014 à 16:52:47    

dreameddeath a écrit :

je ne vois pas en quoi c'est "facile": car pour moi la solution n'est pas seulement dans la jointure. Le pb vient du fait qu'il y a 2 types d'adresse à mettre dans la même colonne de sortie. Hors pour "assembler" 2 jeux de données, il n'y a que le union à ma connaissance.
 
Une variation autour de qq chose ça devrait marcher...

Code :
  1. select * from (select cli1.id, cli1.adr, 0 as rank from cli1 union select cli2.id, cli2.adr, 1 as rank from cli2) all_addresses order by id, rank



 
Finalement je vais devoir me débrouiller autrement que par une requête SQL pour pas ne chambouler le fonctionnement actuel du curseur, intégrité du programme oblige ...
Du coup dans mon curseur je vais simplement créer une ligne supplémentaire à mon tableau en cas de rupture sur le code client.
 
En fait le problème c'est qu'à chaque ligne il me faut les infos de cli1 ET de cli2, + donc une ligne avec les infos de cli1 uniquement (donc tous les champs de cli2 à vide). Bref merci quand même ;)


Message édité par Kirvel le 01-07-2014 à 16:53:23

---------------
MyAnimeList
Reply

Marsh Posté le 01-07-2014 à 20:34:27    

J'avais mal lu, le soucis de Kirvel, mais pareil la solution tout aussi "basique" et dans tout manuel de sql ...ou sur internet...
 
il faut faire un union join si tu veux avoir les 2 types d'adresses...
 
select a.id, a.adr from cli1 as a where a.cli = 'AAA'
union join
select b.id, b.adr from cli2 as b where b.cli = 'AAA'
 
(Faire gaffe à la longueur des champs et au typage..)
 
c'est l'idée: après tu mets la syntaxe que ton SGBD accepte.
 
Guillaume


---------------
mieux vaut être un con au chaud, qu'un con gelé lol
Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed