A, B, C
-----------
1 20 30
2 27 30
3 20 30
4 27 30
5 20 30
Grupa elemenata koju ispitujemo za polje A je [2,3,4]
Nosioc grupe je prvi član grupe, u ovom slučaju “2”
Kako postaviti upit za tu grupu, dali itko iz grupe ima zajednički B & C sa nosiocom grupe koji je ovdje “2” ? Znači u ovom slučaju tražimo članove iz grupe koji imaju B=27 & C=30
Po ovom gore primjeru, element iz grupe “4” ima zajednički B&C sa prvim članom grupe, to su jel B=27 i C=30.
Kako napisati Query da možemo testirati bilo koju grupu? (Naravno, nosioc grupe se može definirati kao zasebna varijabla, a ostatak grupe kao zasebna varijabla)
Također treba imati na umu da A nije unique kolona…tako nosioc grupe može imati više B&C vezanih uz sebe, a treba naći bilo koji redak koji se podudara po B&C sa bilo kojim upisom nosioca grupe.
Npr:
A, B, C
-----------
4 27 30
5 20 30
4 20 30
6 20 30
Test group [4,6] ?
Grupa također vraća select jer imamo upise:
A B C
4 - 20 - 30
6 - 20 - 30
Da probam zdravo seljački.
Imamo neku grupu, tipa: (2,4,6)… to su elementi iz polja A.
Želimo naći sve one retke gdje A tog retka pripada u tu grupu … a da dohvaćeni retci imaju one vrijednosti B i C kao što ih ima uz sebe vezane prvi A iz zadane grupe.
Mislim, mozemo jednostavnije i ovako reći:
A=2, groupA = (4,6)
Zadatak: Dohvati one retke koji imaju A da pripadaju u grupu @groupA, a da su tim retcima B i C polja ista kao što su B i C tamo gdje je A =2
SELECT tableA.*
FROM group_table tableA
JOIN group_table tableB
ON tableA.b = tableB.b
AND tableA.c = tableB.c
WHERE tableA.a IN ( 4, 6 )
GROUP BY tableA.a;
@nosiocgrupe je varijabla za polje A. U primjeru je to 2,3,4,5 ili 6
SELECT *
FROM tablica
WHERE CAST(B AS VARCHAR(10)) + ‘#’ + CAST(C AS VARCHAR(10)) IN (SELECT DISTINCT CAST(B AS VARCHAR(10)) + ‘#’ + CAST(C AS VARCHAR(10)) FROM tablica WHERE A = @nosiocgrupe)
OR CAST(C AS VARCHAR(10)) + ‘#’ + CAST(B AS VARCHAR(10)) IN (SELECT DISTINCT CAST(B AS VARCHAR(10)) + ‘#’ + CAST(C AS VARCHAR(10)) FROM tablica WHERE A = @nosiocgrupe)
Nije mi baš jasno tvoje rješenje…ali si mi dao odličnu ideju. Trebam dodati novo polje u tablicu: “BC” koje će biti u startu mergano B i C (kao što ti castaš i zbrajaš) …i onda bi ovo trebalo raditi:
SELECT * FROM table WHERE A in @groupA and BC IN (SELECT BC from table WHERE A=@A)
Inače mi se ne sviđa to castanje…jer mi se čini da tu indexi onda ne djeluju… pošto database engine mora prvo sva polja castati i zbrojiti da bi znao sa čime ima posla. Ovako ako se od starta vodi “BC” polje …ono je svojevrstan index.
Inače moram priznati da nisam skužio tvoj OR dio u queryu… zašto si zarotirao B i C …i čemu taj dio uopće.
Osim toga, imaš varijablu @nosiocgrupe, ali nigdje i varijablu @grupaA unutar koje se traži. No to bi valjda bilo trivijalno dodati na tvoj upit …samo velim, nije mi jasan čemu OR dio.
U pravu si, krivo sam se izrazio. Tim pristupom su dva upita minimalna…tj. tim pristupom treba onoliko upita koliko se puta pojavljuje u tablici redak sa nosiocom grupe + 1 extra upit.
To i jeste razlog zašto tražim riješenje koje riješava sve jednim upitom…da su uvijek dva upita, nebi me to niti žuljalo, ali upravo zato što broj upita raste ovisno o slučaju, takvo riješenje nije nikako skalabilno. Jer može doći situacija da ima onda i preko 1000 upita… što nije zdravo…
Ne radi… al sviđa mi se ovo joinanje tablice same sa sobom.
I ovo radi: SELECT * FROM table WHERE A in @groupA and BC IN (SELECT BC from table WHERE A=@A)
tako da je case solved.
…
…
Nego, još jedno pitanje vezano uz SQL temu…
Jel moguće napraviti na razini SQL-a rekurzivni upit?
Recimo da imamo tablicu:
A | B
------
1 4
4 8
8 6
Gdje je to nekav odnos parent-child. Znači A je parent od B.
I sada želimo naći sve roditlje od B=6 uz stablo skroz do vrha.
Znači prvi roditelj od 6 je 8.
Pa roditelj od 8 je 4
Pa roditelje od 4 je 1
1 više nema roditelja i tu smo znači stigli do vrha stabla od child=6 do njegovog izvornog roditelja=1.
Jel ikako moguće dohvatiti tako rekurzivno sve roditelje uz stablo, bez da se iterira sa više querya?