Newsgroup: it.comp.software.database
Titolo: Left join e condizione where

Ciao,
come mai in MS SQL Server 2000 una query del tipo
select A.CAMPO1,A.CAMPO2,B.CAMPO3 
from TABELLA1 as A where CAMPO1=10
left join TABELLA2 B on
B.CAMPO4=A.CAMPO1 
mi da errore ? Se tolgo la where CAMPO1=10 e la metto sotto la left join la
query funziona ma non ritorna quanto voglio (giustamente peraltro)...
Come posso riscriverla considerando la condizione CAMPO1=10 che non deve
essere legata alla left join ?

"Starsky" <write...@nohost.invalid> ha scritto nel messaggio
news:10ltlmq6ci2ok$.1bmz46buhyb3n$.dlg@40tude.net...

Cosě
--------------------
select A.CAMPO1,A.CAMPO2,B.CAMPO3
from (SELECT * FROM TABELLA1 where CAMPO1=10)  A
left join TABELLA2 B on
A.CAMPO1=B.CAMPO4
--------------------
Ciao Giorgio

 query funziona ma non ritorna quanto voglio (giustamente peraltro)...
scusa, xché "giustamente"?

 scusa, xché "giustamente"?
Perche' la clausula viene considerata all'interno del left join credo...
Ho letto la soluzione di Giorgio, mi chiedo se a questo punto l'SQL ANSI 92
contempli l'uso della clausula where all'interno di una query con left
join..

 scusa, xché "giustamente"?
E' la sintassi per utilizzare le tabelle derivate.
DA BOL
-------------------------
Utilizzo della clausola FROM
.......
Una o piů tabelle derivate, ovvero istruzioni SELECT nella clausola FROM a
cui viene fatto riferimento tramite un alias o un nome specificato
dall'utente. Il set di risultati dell'istruzione SELECT nella clausola FROM
fornisce una tabella che viene utilizzata dall'istruzione SELECT esterna. Ad
esempio, l'istruzione SELECT seguente utilizza una tabella derivata per
determinare se esiste una libreria in cui sono disponibili tutti i libri del
database pubs:
SELECT ST.stor_id, ST.stor_name
FROM stores AS ST,
     (SELECT stor_id, COUNT(DISTINCT title_id) AS title_count
      FROM sales
      GROUP BY stor_id
     ) AS SA
WHERE ST.stor_id = SA.stor_id
  AND SA.title_count = (SELECT COUNT(*) FROM titles)
----------------------------
Ciao Giorgio



Mi rispondo da solo: basta mettere le where in fondo ..!
select A.CAMPO1,A.CAMPO2,B.CAMPO3 
from TABELLA1 as A
left join TABELLA2 B on
B.CAMPO4=A.CAMPO1 
where CAMPO1=10

"Starsky" <write...@nohost.invalid> ha scritto nel messaggio
news:1n8ptgy25mz0q.itjyobpwl5iy$.dlg@40tude.net...

ma non hai detto che il risultato ottenuto non č quello desiderato ?
Ciao Giorgio

 > In data Mon, 5 Apr 2004 13:02:10 +0200, Starsky ha scritto:
Prova questo esempio
-----------------USE TEMPDB
GO
CREATE TABLE A
(x int)
CREATE TABLE B
(x int,
 y int)
INSERT A VALUES(1)
INSERT A VALUES(2)
INSERT A VALUES(3)
INSERT A VALUES(4)
INSERT B VALUES(1,10)
INSERT B VALUES(2,10)
INSERT B VALUES(3,1)
INSERT B VALUES(4,1)
SELECT A.x,B.y
FROM   A LEFT JOIN B
       ON A.x=B.X
WHERE  B.Y=10
SELECT A.x,C.y
FROM   A LEFT JOIN
       (SELECT * FROM B WHERE y=10) AS C
       ON A.x=C.X
DROP TABLE A,B
------------------------------------
Risultato prima select
x           y
----------- ----------- 
1           10
2           10
Risultato seconda select
x           y
----------- ----------- 
1           10
2           10
3           NULL
4           NULL
come vedi c'è una bella differenza
Ciao Giorgio

 ma non hai detto che il risultato ottenuto non č quello desiderato ?
certo: guarda bene le due query
1.
select A.CAMPO1,A.CAMPO2,B.CAMPO3 
from TABELLA1 as A where CAMPO1=10
left join TABELLA2 B on
B.CAMPO4=A.CAMPO1 and
A.CAMPO1=10
2.
select A.CAMPO1,A.CAMPO2,B.CAMPO3
from TABELLA1 as A
left join TABELLA2 B on
B.CAMPO4=A.CAMPO1
where CAMPO1=10
Nella 2 la condizione critica non e' con l'and ma nella where ed e' quello
che volevo :-)
In realta' la domanda era di una banalita' sconcertante, se solo avessi
provato a mettere la where in fondo e non dopo il from non avrei avuto
intoppi !!
Ciao e grazie
Starsky

"Starsky" <write...@nohost.invalid> ha scritto nel messaggio
news:ncel8hgtrqy5.nkcm9pjgouka$.dlg@40tude.net...

allora ho capito male il quesito, io ho letto
------------------------------------------
Se tolgo la where CAMPO1=10 e la metto sotto la left join la
query funziona ma non ritorna quanto voglio
------------------------------------------
meglio cosě
Ciao