[ Nebojsa111 @ 24.12.2007. 18:25 ] @
Imam zapetljan SQL problem koji cu uprostiti na primeru sa 2 tabele.

Table1 Table2
====== =======
ID User ID Table1_ID Nadimak
1 Ime1 1 1 Nadimak1
2 Ime2 2 1 Nadimak2
5 Ime3 8 2 Nadimak3

Nadimci su vezani za usera u odnosu 1:N.

Na formi se nalaze textboxes za pretragu i search button.

Rezultat pretrage treba da bude samo user iz Tabele1, tj. ako se pretrazuje nadimak, rezultat treba da prikaze samo usere kod kojih je taj nadimak pronadjen uz LIKE %nesto% uslov i to bez ponavljanja usera. Ceo problem obuhvata nekoliko tabela (nadimci, adrese, mailovi, IMs...) koje sve mogu biti vezane za Tabelu1 u odnosu 1:N (jedan prema vise), a bez obzira sta se pretrazivalo (jedan, nijedan ili vise parametara u isto vreme - uvek uz LIKE %nesto% uslov), rezultat treba da bude User (bez ponavljanja usera u rezultatu), iz Tabele1 kod kojih je "search" slucaj pronadjen.

Search radi na sajtu koji ima jaaaako velik broj usera, pa bi trebao da bude optimizovan, bez upotrebe temp tabela.

Ne trazim da mi neko ispise gotovo resenje... Dovoljno mi je samo uputstvo ili ideja bazirana na iskustvu kako da ovo resim...
[ Fedya @ 24.12.2007. 19:03 ] @
SELECT ime FROM tabela1
JOIN tabela2 ON tabela1.id = tabela2.tabela1_id
WHERE( @param=null OR tabela2.Nadimak LIKE %@param%) AND (@sledeciParam = null OR NekoPolje LIKE %@sledeciParam%)
itd...

Tako se povezes sa svim tabelama. Paremtri koji su null ce biti ignorisani, one koje prosledis ce biti ukljuceni u pretragu.

btw, nadam se da sam dobro razumeo pitanje
[ Nebojsa111 @ 24.12.2007. 19:29 ] @
Pozz Fedya!

Hvala na javljanju!

JOIN u SELECT komandi uzima u obzir samo one ID-jeve koji postoje u obe tabele koje se vezu... Postoje useri koji ne moraju imati nijedan nadimak... To odmah znaci da su ti useri iskljuceni iz rezultata ako koristimo JOIN na tabelu nadimaka iako ti useri mozda imaju neki drugi podatak za pretragu...
[ Fedya @ 24.12.2007. 19:36 ] @
U tom slucaju koristi left outer join
[ Nebojsa111 @ 24.12.2007. 20:01 ] @
Pa ni left join ne pomaze... :) Kakav god join da stavis iskljucice sve one koji nemaju ID u nekoj od tabela, jer je rezultat samo ime iz prve tabele. Left join bi pomogao da imam nesto ovako:

Code:

SELECT p.Ime, Nadimak = CASE WHEN n.Nickname IS NOT NULL THEN n.Nickname ELSE '' END
FROM Profiles p WITH NOLOCK
  LEFT JOIN Nicknames n ON p.ID = n.ProfileID
WHERE
....


Ma nije bitno... Snaci cu se nekako... Hvala ti u svakom slucaju!
[ CallMeSaMaster @ 27.12.2007. 22:27 ] @
LEFT OUTER Join ili RIGHT OUTER join mora da radi, zavisno u odnosu na koju tabelu radis