Newsgroup: it.comp.lang.visual-basic
Titolo: [VB6] Query Left Join

Ho 2 Tabelle Articoli e Magazzino
La prima con campi "Escludi", "IDArticolo", "Descrizione"
Da questa devo estrapolare solo i record con Escludi =true
La seconda con campi "IDArticolo", "Data", "Scarico"
Da questa devo estrapolare solo i record dell'ultimo scarico 
Max(Magazzino.Data) AS UltimoScarico, And (Magazzino.Scarico>0) che 
riguardano ID Articolo della tabella Articoli
Tenendo presente che per i record estrapolati dalla tabella Articoli non 
necessariamente ci sia un o pi� movimenti in magazzino, per questo ho messo 
il LEFT JOIN.
SELECT Articoli.Escludi, Articoli.IDArticolo, Articoli.Descrizione, 
Max(Magazzino.Data) AS UltimoScarico
FROM Articoli LEFT JOIN Magazzino ON Articoli.IDArticolo = 
Magazzino.IDArticolo
WHERE (((Articoli.Escludi)=True)) se qui inserisco And (Magazzino.Scarico>0) 
non mi restituisce i record della tabella Articoli senza movimento.
GROUP BY Articoli.Escludi, Articoli.IDArticolo, Articoli.Descrizione
Come devo fare?
Carmelo 

 Come devo fare?
La query ti tirer� fuori tutti i record dove magazzino.scarico � > 0 ma 
NON quelli dove magazzino.scarico e NULL, quindi (non ho testato ma 
dovrebbe essere pi� o meno cos�)
WHERE Articoli.Escludi=True And ( (Magazzino.Scarico > 0) OR 
(Magazzino.Scarico Is Null) )
ciao
stefano

 NON quelli dove magazzino.scarico e NULL, quindi (non ho testato ma 
� NULL
ciao
stefano

 GROUP BY Articoli.Escludi, Articoli.IDArticolo, Articoli.Descrizione
Se metti una condizione del genere la LEFT JOIN diventa implicitamente una
INNER JOIN. Quindi o testi la condizione nella condizione della INNER,
oppure come ti hanno detto usi IS NULL.
Inoltre tu chiedi quelli con scarico >0, ma vuoi solo quelli o anche quelli
senza scarico?
PS: non c'entra nulla con VB6, magari metti un tag diverso.

"Andrea [Work]" <andrea.isw...@gmail.invalid> ha scritto nel 
messaggio news:1r55jzcmnbdmq$.17cm97wfjg5cv.dlg@40tude.net...

La query mi dovrebbe restituire:
Tutti i record di Articoli con Escludi=True
se esiste movimento nel magazzino allora la data di ultimo scarico 
(Max(Magazzino.Data) con Scarico>0
altrimenti Data a null
Carmelo 

 ha scritto nel messaggio 
news:4adc05f5$0$704$5fc...@news.tiscali.it...

In questo modo mi restituisce i record Null ma tutti i record con Scarico > 
0.
Io voglio sia i record Null (cio� quelli che non hanno movimento) ma dei 
record che hanno  pi� movimenti solo la riga con l'ultima data con Scarico > 
0, per questo ho scritto Max(Magazzino.Data).
Carmelo

 0, per questo ho scritto Max(Magazzino.Data).
Attenzione � diverso tra volere la data maggiore, o i dati relativi al
record con data movimento maggiore.
Se nel movimento hai la Quantit�, e vuoi vedere quella dell'ultimo
movimento non lo fai con la Max(Data) per capirci.

 altrimenti Data a null
Se data � un valore che c'� sempre puoi fare come ti ha detto Stefano nel
suo post.

"Andrea [Work]" <andrea.isw...@gmail.invalid> ha scritto nel 
messaggio news:zhzy3ue02x7g.1oc2f2j6nsv7m$.dlg@40tude.net...

Per capirci:
Tabella Articoli
IDArticolo|Descrizione    |
     100     |Pane e salame|
Tabella Magazzino
IDArticolo|Data           |Carico|Scarico|
     100     |25/01/2009|   8      |    0     |
     100     |01/02/2009|   0      |    5     |
     100     |05/02/2009|   0      |    2     |     devo recuperare solo 
questa riga
come faccio?
Carmelo

 come faccio?
Ci puoi riuscire solo se la data ï¿œ chiave assieme all'IDArticolo, ossia 
se la tabella Magazzino ï¿œ giï¿œ aggregata per articolo/giorno.
Se invece ï¿œ un elenco di movimenti, occorre avere un campo IDMovimento 
univoco.
In ogni caso, se esistono due record con uguale quantitï¿œ di scarico, li 
otterrai entrambi.
Ipotizziamo di essere nel primo caso:
SELECT ART.DESCRIZIONE, MAG2.IDARTICOLO
, MAG2.DATA, MAG2.CARICO, MAG2.SCARICO
FROM TAB_ARTICOLI AS ART
LEFT OUTER JOIN
   (
   SELECT
       IDARTICOLO
       ,MAX(DATA) AS DAT
   FROM TAB_MAGAZZINO
   WHERE SCARICO > 0
   )
 AS MAG1
ON ART.IDARTICOLO = MAG1.IDARTICOLO
LEFT OUTER JOIN TAB_MAGAZZINO AS MAG2
ON MAG1.IDARTICOLO = MAG2.IDARTICOLO
AND MAG1.DAT = MAG2.DATA
Scritta a braccio in TSql, sistemala per il tuo db.
Alberto


Adesso provo
Carmelo 

 Il campo IDMovimento univoco c'ï¿œ
E dirlo prima?
Speriamo almeno che non sia un autoincrementale coerente con la data 
(cioï¿œ che l'ordine per IDMovimento non sia necessariamente lo stesso 
dell'ordine per Data), altrimenti ci siamo fatti mille pippe mentali 
per una cosa abbastanza banale...
Alberto


Invece � autoincrementale.
Se non fosse come risolverebbe?
Carmelo 

 Se non fosse come risolverebbe?
'Se non fosse' te l'ho giï¿œ postato, cosa stai chiedendo??
Alberto

 maggiore tale per cui ecc...
Occhio che non deve essere neanche possibile modificare da programma la
data di un movimento gi� creato, altrimenti tutto va a donnine :)
Io in questi caso prendo il primo record con data MAX ordinando per ID
decrescente, ma per le "cose serie" non andrebbe bene comunque credo.

 decrescente, ma per le "cose serie" non andrebbe bene comunque credo.
Si, certo, deve essere deterministicamente coerente.
La riflessione nasceva da una mia deformazione, in quanto facendo 
spesso sistemi di rilevamento dati, i movimenti riportano sia un ID 
autoincrementale, sia la data/ora di acquisizione del dato, che una 
volta inserito non viene piï¿œ toccato, per cui ID o Data/ora sarebbero 
coerenti come Order, anzi, in realtï¿œ ï¿œ piï¿œ preciso l'ID, perchï¿œ la 
dataora di Sql ha precisione ai 3 millisecondi, per cui avere record 
con stessa data-ora ï¿œ del tutto normale, mentre l'ID autoincrementale ï¿œ 
il vero ordinamento.
Comunque la query l'ho giï¿œ scritta, ho dimenticato un banale Group By 
nella 'sottoquery' (che sottoquery non ï¿œ, andrebbe meglio definita come 
vista), alla fine fine basta usare ciï¿œ che ï¿œ deterministicamente 
colonna di sort e siamo a posto.
Ciao
Alberto

 il vero ordinamento.
Si, sar� che io ho sempre qualche cliente che sbaglia le date dei movimenti
e deve correggerle :)