Newsgroup: it.comp.lang.visual-basic
Titolo: VB6    e   SQL

Immaginate una tabella di distinta base (DIST) come segue:
 
Codice Padre (CODP)      12 caratteri alfanumerici
Codice Figlio  (CODF)      12 caratterli alfanumerici
Quantit�          (QTA)        campo numerico
 
In una query sql la tabella distinta base pu� essere
collegata a quella anagrafica tramite il codice padre:
SELECT * FROM DIST INNER JOIN ANAG ON DIST.CODP=ANAG.COD
 
oppure pu� essere collegata tramite il codice figlio:
SELECT * FROM DIST INNER JOIN ANAG ON DIST.CODF=ANAG.COD
 
Mi sembra di ricordare che sia possibile collegare contemporaneamente 
l'anagrafica sia al codice padre
che al codice figlio utilizzando un metodo che non
ricordo (forse ALIAS?)
 
In ogni caso non ne ricordo la grammatica.
 
Non sono riuscito a trovare esempi in merito.
 
Se qualcuno mi pu� aiutare .....
 
Grazie e saluti.
Sauro 
 
 


 
Per capire a che cosa vuoi arrivare dovresti dare maggiori informazioni,
tipo che relazione hanno le due tabelle e quale obiettivo ti sei posto
 
-- 
http://freewareonline.org/
 
http://netuser.altervista.org/
 
http://salclem2.altervista.org/
 
 

 ricordo (forse ALIAS?)
 
Se ho capito bene, si, puoi farlo con un alias, da impostare subito dopo il nome tabella nella clausula "FROM"
 
SELECT DIST.*, PADRI.<qualcosa>, FIGLI.<qualcosa>
FROM DIST 
INNER JOIN ANAG AS PADRI ON (DIST.CODP=PADRI.COD)
INNER JOIN ANAG AS FIGLI ON (DIST.CODF=FIGLI.COD)

ANAG AS PADRI
 
Ah, ecco!
 
Grazie Luca
Sauro 
 
 

 tipo che relazione hanno le due tabelle e quale obiettivo ti sei posto
 
Devo collegarmi due volta alla medesima tabella con
2 diverse selezioni.
 
Sembra che Luca mi abbia capito.
 
Ciao e grazie. 
 
 

INNER JOIN ANAG AS FIGLI ON (DIST.CODF=FIGLI.COD)
 
Dubito che abbia qualche senso logico sta query, se riesci a contraddirmi posta
un risultato (reale e funzionante) della query


 posta un risultato (reale e funzionante) della query
 
Ipotizzando che ANAG sia la classica tabella codice->descrizione
 
COD DESCR
--- -----
1   Mela
2   Pera
3   Fava
 
e la tabella DIST sia fatta come ha scritto lui nel primo post, la query di cui sopra (con .DESCR al posto di .<qualcosa>... ovviamente l'ho provata su un database fatto al volo, prima di rispondere) restituisce per ogni singolo record la versione decodificata sia della colonna padre che della colonna figlio
 
Se vuoi un caso reale in cui usiamo una cosa del genere in un nostro software è la ricerca di tutti i processi (in tabella A) in cui in una checklist di attivita' da fare ma non nota a priori e non uguale per tutti i processi (tabella B in normale relazione 1...n) l'attività X sia in un determinato stato e contestualmente quella Y sia in un altro
 
Es: dimmi tutte le delibere in cui c'è 'Firma del Dirigente' fatta ma 'Parere Contabile' in lavorazione...


Mi spieghi ad esempio come fa questo sgorbio a selezionare dei record di PADRI o di FIGLI se neanche compare
nella clausola FROM ???


>INNER JOIN ANAG AS FIGLI ON (DIST.CODF=FIGLI.COD)
 
 
Cos� ad esempio avrebbe gi� pi� senso, anche se non seleziona una beata fava
 
SELECT DIST.id, DIST.codp, DIST.codf, DIST.qta, DIST.qualcosa, FIGLI.cod, PADRI.cod
FROM (DIST INNER JOIN anag AS FIGLI ON DIST.codf = FIGLI.cod)
INNER JOIN anag AS PADRI ON DIST.codp = PADRI.cod;


 nella clausola FROM ???
 
Questo sgorbio funziona perfettamente perchè così ragiona INNER JOIN nel risolvere le tabelle coinvolte...
 
Se ti dico che l'ho provata prima, vuol dire che l'ho provata (sia su SQL Server che su MySQL, giusto per scrupolo... per farti contento ho fatto un giro anche con Oracle proprio adesso, togliendo AS che non gradisce)
 
Tu l'hai provata prima di parlare?!
 
Questo è lo script di creazione delle tabelle, con qualche dato di esempio:
CREATE TABLE ANAG(
	COD varchar(12) NOT NULL,
	DESCR varchar(50)
);
INSERT INTO ANAG VALUES ('1','PIPPO');
INSERT INTO ANAG VALUES ('2','PLUTO');
INSERT INTO ANAG VALUES ('3','PAPERINO');
 
CREATE TABLE DIST(
	CODP varchar(12) NOT NULL,
	CODF varchar(12) NOT NULL,
	QTA int
);
INSERT INTO DIST VALUES ('1','1',123);
INSERT INTO DIST VALUES ('1','2',212);
INSERT INTO DIST VALUES ('2','2',610);
INSERT INTO DIST VALUES ('2','3',25);
 
e questa la query, esattamente come sopra tranne per <qualcosa>
 
SELECT DIST.*, PADRI.DESCR, FIGLI.DESCR
FROM DIST
INNER JOIN ANAG AS PADRI ON (DIST.CODP=PADRI.COD)
INNER JOIN ANAG AS FIGLI ON (DIST.CODF=FIGLI.COD);
 
Vai e vinci...

 un risultato (reale e funzionante) della query
 
SelectSQL = "SELECT * FROM (DIST INNER JOIN ANAG AS PADRI ON DIST.CODP = 
PADRI.A_COD) INNER JOIN ANAG AS FIGLI ON DIST.CODF = FIGLI.A_COD"
WhereSQL = " WHERE FIGLI.A_TIPO = 'ALLUM'"
OrderSQL = " ORDER BY PADRI.A_CLIENTE, DIST.CODP, DIST.CODF"
Set PublicRS = PublicDB.OpenRecordset(SelectSQL & WhereSQL & OrderSQL)
 
Ti spiego anche l'utilizzo reale della query.
 
E' aumentato il costo dell'alluminio del 12% circa.
Il mio cliente deve quindi aumentare i prezzi di vendita
di quegli articoli che sono prodotti in alluminio.
 
Con la query ho selezionato e stampato tutti quegli
articoli (PADRI) che hanno almeno un componente
in alluminio (FIGLI).
La stampa riporta anche prezzi, costi e quantit�.
 
Ciao, Sauro 
 
 


 
Mi arrendo all'evidenza, avevo preso un abbaglio, chiedo venia


> Mi arrendo all'evidenza, avevo preso un abbaglio, chiedo venia
 
Figurati.
Qualche volta succede a tutti.
 
Ciao, Sauro