Newsgroup: it.comp.software.database
Titolo: problema outer join su Oracle

Ho un problema con una query Oracle 8.05
Data la seguente struttura dati:
Archivio articoli (PARTI)
PK cod_articolo
contiene n campi di definizione dell'articolo quali
Descrizione, unita' di misura, classe, ecc...
Archivio definizione articoli sui magazzini (PARTMAG)
PK cod_articolo + cod_magazzino
contiene 0 o n record per ogni articolo e su di esso sono presenti 
alcune specifiche dell'articolo presente in quel magazzino quali
valore della scorta minima 
Archivio definizione fornitori abituali degli articoli (PARTCLFO)
PK cod_articolo + cod_fornitore
contiene 0 o n record per ogni articolo e su di esso sono indicati i
fornitori abituali
Vorrei fare una vista per estrarre i dati di tutti gli articoli con le
eventuali informazioni presenti sui magazzini.
In piu' vorrei estrarre per ogni articolo 1 solo fornitore abituale se
presente, in caso di definizione dell'articolo su piu' magazzini, il
fornitore abituale dovra' essere ripetuto uguale.
Quindi a fronte di un'anagrafica articoli con 100 record, ognuno dei
quali e' definito su 2 magazzini e dispone di 2 fornitori abituali
dovrebbero uscire 200 record (1 per ogni articolo/magazzino)
Se ci fossero altri 10 articoli non definiti a livello di magazzino
dovrebbero uscire altri 10 record in piu' a prescindere dal numero di
fornitori abituali.
L'idea e' quella di fare un'outer join tra le 3 tabelle in modo
classico tra PARTI e PARTMAG,
ma tra PARTI e PARTCLFO questo sistema non funziona perche' estrae 1
record per ogni fornitore abituale presente (e io ne voglio 1 solo).
Per ovviare a cio' ho impostata una query innestata che sfrutta il
ROWNUM, solo che non sono riuscito a definire su questa relazione
un'outer JOIN.
La vista l'ho impostata cosi':
create or replace view X1VPARMA as
select parti.cod_articolo, 
       parti.parti_desc, 
       parti.parti_um, 
       parti.parti_um2, 
       parti.parti_gstock, 
       parti.parti_scmin, 
       parti.parti_scmax, 
       partmag.cod_magazzino,
       partmag.pm_scmin,
       partmag.pm_scmax,
       partclfo.cod_fornitore
  from parti a,partmag b,partclfo c
 where a.cod_articolo = b.cod_articolo (+)
   and a.cod_articolo = c.cod_articolo (+)
   and (c.cod_articolo, c.cod_fornitore) =
   (select cod_articolo,cod_fornitore from partclfo d 
       where d.cod_articolo=a.cod_articolo and rownum <= 1);
in questo modo escono solo gli articoli che hanno almeno 1 fornitore
abituale escludendo quelli che non lo hanno e questo non va bene
Impostandola cosi':
create or replace view X1VPARMA as
select parti.cod_articolo, 
       parti.parti_desc, 
       parti.parti_um, 
       parti.parti_um2, 
       parti.parti_gstock, 
       parti.parti_scmin, 
       parti.parti_scmax, 
       partmag.cod_magazzino,
       partmag.pm_scmin,
       partmag.pm_scmax,
       partclfo.cod_fornitore
  from parti a,partmag b,partclfo c
 where a.cod_articolo = b.cod_articolo (+)
   and a.cod_articolo = c.cod_articolo (+);
Escono tutti gli articoli moltiplicati per i magazzini associati e per
i fornitori abituali associati e questo non va bene;
Mi sarebbe piaciuto fare cosi':
create or replace view X1VPARMA as
select parti.cod_articolo, 
       parti.parti_desc, 
       parti.parti_um, 
       parti.parti_um2, 
       parti.parti_gstock, 
       parti.parti_scmin, 
       parti.parti_scmax, 
       partmag.cod_magazzino,
       partmag.pm_scmin,
       partmag.pm_scmax,
       partclfo.cod_fornitore
  from parti a,partmag b,partclfo c
 where a.cod_articolo = b.cod_articolo (+)
   and a.cod_articolo = c.cod_articolo (+)
   and (c.cod_articolo, c.cod_fornitore) =
   (select cod_articolo,cod_fornitore from partclfo d 
       where d.cod_articolo=a.cod_articolo and rownum <= 1) (+);
ma purtroppo mi da errore di sintassi.
qualcuno ha qualche idea ?!?!
Thanks
Ciaps
Stracca

 wrote in message
news:egkcft8i9ck54o0fg...@4ax.com...
