[ Mia @ 09.07.2003. 10:36 ] @
Kako da optimalno napisem slijedeci SELECT?

1) Imam 2 tabele: tab1 i tab2
2) povezane su poljima: tab1.a1 = tab2.a2
3) trebam selektirati polja:tab1.b1,tab1.c1,tab2.b2,tab2.c2
4) trebam prvo uzeti podatke iz tab1 i napraviti LEFT JOIN na tab2, npr.

SELECT tab1.b1,tab1.c1,tab2.b2,tab2.c2
FROM tab1 LEFT JOIN tab2 ON tab1.a1 = tab2.a2
WHERE "Uslov"

Uz sve to, ne trebam uzimati slogove iz tab1 za koje nema odgovarajucih u tabeli tab2.

[ leka @ 10.07.2003. 14:19 ] @
Da li nam mozes dati opis te dve tabele? Dakle daj jedan
Code:
desc tab1; desc tab2;
:)
[ Nub.Saibot @ 10.07.2003. 14:49 ] @
Pokušaj ovako:

SELECT tab1.b1,tab1.c1,tab2.b2,tab2.c2
FROM tab1
INNER JOIN tab2 ON tab2.a2 = tab1.a1
WHERE "Uslov"

Koliko znam inner join ne prikazuje redove za koje nema odgovarajućih u drugoj tabeli.

[ Last Man Standing @ 11.07.2003. 07:30 ] @
Ne mozes da koristis i LEFT JOIN (tacka 4) i da dobijes samo one slogove iz t1 za koje postoji odgovarajuci kljuc u t2. Kontradiktorno je. Reci im da ti malo bolje objasne sta hoce.
[ Mia @ 11.07.2003. 10:01 ] @
Hvala vam, ja milsila da sam bila jasna.
Ustvari, trebam izeti podatke iz t2, ali samo ako postoje odgovarajuci u t1.

Slijedeci select-ovi mi daju iste rezultate (bar mi se tako cini):
1)
SELECT tab1.b1,tab1.c1,tab2.b2,tab2.c2
FROM tab1,tab2
WHERE tab1.a1 = tab2.a2 AND "Uslov"
2)
SELECT tab1.b1,tab1.c1,tab2.b2,tab2.c2
FROM tab1 RIGHT JOIN tab2 ON tab1.a1 = tab2.a2
WHERE "Uslov"
3)
SELECT tab1.b1,tab1.c1,tab2.b2,tab2.c2
FROM tab1 INNER JOIN tab2 ON tab1.a1 = tab2.a2
WHERE "Uslov"

Je li to zaista tako i sta je optimalno?
[ mladenovicz @ 11.07.2003. 11:52 ] @
Evo jedan primercic. Tabele u primeru su Patient i Study, a ListaPolja su polja koja treba da budu selektovana. Napravis novi Query u Accessu i onda mu menjas u DesignViewu JOIN PROPERTIES. Imas tri slucaja, prvo ide opis, pa SQL upit

1) Only include rows where the joined fields from both tables are equal

SELECT ListaPolja
FROM Patient INNER JOIN Study ON Patient.PatientID = Study.PatientID

2) Include ALL records from 'Patient' and only those records from 'Study' where joined fields are equal

SELECT ListaPolja
FROM Patient LEFT JOIN Study ON Patient.PatientID = Study.PatientID

3) Inlude All records from 'Study' and only those records from 'Patient' where joined fields are equal

SELECT ListaPolja
FROM Patient RIGHT JOIN Study ON Patient.PatientID = Study.PatientID
[ Last Man Standing @ 12.07.2003. 04:32 ] @
RIGHT JOIN pod (2) ne valja. Izmedju (1) i (3) optimalno je (1) jer ces manje da kucas :)

Kad imas nedoumice sta je najbolje, pogledaj semu koju napravi Query Analyzer ili pre upita ukucaj SET SHOWPLAN_TEXT ON.

Uzgred, kako ce join da se izvrsi zavisi od vise faktora - gde su ti indexi, koliko su velike tabele (recimo hash join je bolji kad se tabele znatno razlikuju po velicini itd.)

Procitaj i ovo i vise niko nece smeti da se zeza sa tobom:

http://www.sqlmag.com/Articles/Index.cfm?ArticleID=7443