[ djdejan @ 05.05.2006. 13:39 ] @
Problematika je sledeca:

npr. imam dve tabele

Tabela1
id, nesto
------------


Tabela2
------------
id
id_iz_tabele1
vrednost


Treba da napisem takav upit koji ce izvuci sve zapise iz tabele1 koji u tabeli2 imaju dva zapisa cije su vrenosti 2 i 3 npr.


Ako tabele imaju sledece zapise:

Tabela1
id, nesto
-----------
id1, fsdfd
id2, dsfr
id3, dsfd

Tabela2
id, id_iz_tabele1, vrednost
-------------------------
1, id1, 2
2, id2, 2
3, id3, 3
4, id3, 2

U ovom primeru treba da vratim zapis iz tabele1 koji ima id3, posto u tabeli2 imam zapise sa njegovim id-jem i one imaju vrednosti 2 i 3.

Mozda je malo konfuzno?
[ Ana Komazec @ 05.05.2006. 17:13 ] @
Mozda nesto ovako, samo sto nece uvek davati tacne rezultate ako u polju vrednost imas neke druge brojeve, npr. 4,5,... Ili, ukoliko vrednost za id_iz_tabele1 moze dva puta da ima vrednost 2 ili 3



Code:
 Select Tabela1.id, Tabela1.nesto 
From Tabela1, Tabela2 
Where Tabela1.id=Tabela2.id_iz_tabele1 
          and (Tabela2.vrednost=2 or Tabela2.vrednost=3) 
Group by Tabela1.id, Tabela1.nesto 
Having Count(id_iz_tabele1)>=2


Pozdrav
[ djdejan @ 05.05.2006. 17:39 ] @
To je to!

Hvala Ana !!

[Ovu poruku je menjao djdejan dana 05.05.2006. u 18:44 GMT+1]
[ _owl_ @ 05.05.2006. 20:35 ] @
To nije to, ovaj upit vraca redove i ako u tabeli2 postoje dva reda sa poljem vrednost jednakim 2 i nijedan red sa poljem vrednost jednakim 3) za dati id.
[ djdejan @ 05.05.2006. 21:04 ] @
ali tabela je formirana tako da nije moguce za isti id da postoje dve iste vrednosti.
Zato vrsi posao.
Kako bi inace izgledao upit?
[ Ana Komazec @ 05.05.2006. 22:31 ] @
Citat:
_owl_: To nije to, ovaj upit vraca redove i ako u tabeli2 postoje dva reda sa poljem vrednost jednakim 2 i nijedan red sa poljem vrednost jednakim 3) za dati id.


Napisala sam da u tom slucaju, i u slucaju da postoje i druge vrednosti sem 2 i 3 nece raditi.


Pozdrav
[ _owl_ @ 06.05.2006. 23:56 ] @
Da bi sve moglo da radi iz jednog upita potrebno je da baza podzava subselect u FROM klauzuli (valjda se ovako kaze). Osnovu cine upiti
Code:

SELECT t1.id, t1.nesto FROM tabela1 t1, tabela t2 
WHERE t1.id=t2.id_iz_tabele1 AND t2.vrednost=2 
HAVING COUNT(t2.vrednost)=1

Code:

SELECT t1.id, t1.nesto FROM tabela1 t1, tabela t2 
WHERE t1.id=t2.id_iz_tabele1 AND t2.vrednost=3 
HAVING COUNT(t2.vrednost)=1

Sada je potrebno kombinovati podatke dobijene iz ova dva SELECT-a ili preko JOINA ili preko UNION-a, npr. (polje tabela1.id je primarni kluc)
Code:

SELECT t3.id, t3.nesto FROM 
(SELECT t1.id, t1.nesto FROM tabela1 t1, tabela t2 WHERE t1.id=t2.id_iz_tabele1 AND t2.vrednost=3 HAVING COUNT(t2.vrednost)=1) t3, 
(SELECT t1.id, t1.nesto FROM tabela1 t1, tabela t2 WHERE t1.id=t2.id_iz_tabele1 AND t2.vrednost=2 HAVING COUNT(t2.vrednost)=1) t4 
WHERE t3.id=t4.id

ili
Code:
 
SELECT id, nesto FROM (
(SELECT t1.id, t1.nesto FROM tabela1 t1, tabela t2 WHERE t1.id=t2.id_iz_tabele1 AND t2.vrednost=3 HAVING COUNT(t2.vrednost)=1) 
UNION 
(SELECT t1.id, t1.nesto FROM tabela1 t1, tabela t2 WHERE t1.id=t2.id_iz_tabele1 AND t2.vrednost=2 HAVING COUNT(t2.vrednost)=1) )
HAVING COUNT(id)=2




[Ovu poruku je menjao _owl_ dana 07.05.2006. u 00:59 GMT+1]
[ branimir.ts @ 08.05.2006. 12:22 ] @
Da skratimo pricu.....

TABELA T1
-------------
ID--NAZIV
----------------
1--- MAGACIN
2---SKLADISTE
3---PRODAJA
-----------------

TABELA T2
----------------------
ID T1ID Vrednost
----------------------
1-----3-------12
2-----3--------2
3-----1--------2
4-----1--------3
5-----2--------2
6-----2--------3
-----------------------
Upit:
Code:

SELECT *
FROM T1 AS F
WHERE 
(SELECT COUNT(F.ID) FROM T2 L WHERE L.T1ID=F.ID AND L.VREDNOST IN(2,3) ) = 2;


Rezultat:
Code:

-----------------
ID    Naziv
-----------------
1    MAGACIN
2    SKLADISTE
-----------------


Pozdrav
[ jablan @ 08.05.2006. 12:38 ] @
Citat:
branimir.ts: Da skratimo pricu.....

:D

Bez ugnežđenih upita, bez obzira da li postoji više od jednog reda u T2 itd...
Code:

select distinct t1.id, t1.nesto from table1 t1
inner join table2 t21 on t1.id = t21.t1id and t21.vrednost=2
inner join table2 t22 on t1.id = t22.t1id and t22.vrednost=3


[Ovu poruku je menjao jablan dana 08.05.2006. u 13:38 GMT+1]
[ jablan @ 08.05.2006. 13:19 ] @
Ili, korišćenjem zgodne COUNT(DISTINCT izraz) klauzule:
Code:

select t1.id, t1.naziv from table1 t1
inner join table2 t2 on t1.id = t2.t1id and t2.vrednost in (2,3)
group by t1.id, t1.naziv
having count(distinct t2.vrednost) = 2