Navigacija
Lista poslednjih: 16, 32, 64, 128 poruka.

Unija dve tabele sa

[es] :: MS SQL :: Unija dve tabele sa

[ Pregleda: 2511 | Odgovora: 14 ] > FB > Twit

Postavi temu Odgovori

Autor

Pretraga teme: Traži
Markiranje Štampanje RSS

Milan M. Radovic
Web Developer
Pančevo

Član broj: 16959
Poruke: 743
82.117.198.*



+25 Profil

icon Unija dve tabele sa14.03.2011. u 11:07 - pre 158 meseci
Cilj je da se izvuku redovi iz fixne tabele i nekoliko redova iz view-a ALI da se ogranice na 10 redova skupa...
Problem koji mi predtavlja je sto treba PRVO da budu fixni redovi iz FIXNE tabele... a upit mi mesa redove... :(

Code:
SELECT TOP 10 * FROM _glavni_view
WHERE ident in
(
  ( SELECT top 10 id FROM web_fix_table ) 
  UNION
  ( SELECT top 10 acIdent AS id FROM web_view) order by NEWID() )

)

I don't need a girl for sex , All I Need is Binary and HEX
 
Odgovor na temu

Dusan Kondic
Programer
ZR "Parametar" Ljubovija
Ljubovija

Član broj: 49961
Poruke: 225
*.dynamic.isp.telekom.rs.

Sajt: www.drinacoding.com


+14 Profil

icon Re: Unija dve tabele sa14.03.2011. u 12:01 - pre 158 meseci
Deklariši privremenu tabelu
Code:

DECLARE @T TABLE(RBr INT IDENTITY(1,1), ostala polja ... )

unesi podatke u nju sa dva SELECT-a redosledom kojim želiš da ti podaci
budu poređani i na kraju izvrši upit iz te privremene tabele.
Code:

SELECT * FROM @T ORDER BY RBr
 
Odgovor na temu

Zidar
Canada

Član broj: 15387
Poruke: 3085
*.100.46-69.q9.net.



+79 Profil

icon Re: Unija dve tabele sa14.03.2011. u 12:48 - pre 158 meseci
Ako ti je komplikovano da upotrebis table variable, moze i ovko:
Code:

; WITH Unija AS
(
SELECT top 10 id, 1 AS RedosledTabela 
FROM web_fix_table 
UNION
 SELECT top 10 acIdent AS id, 2 AS RedosledTabela 
 order by NEWID()
FROM web_view
)
SELECT TOP 10 V.*, U.RedosledTabela
FROM _glavni_view AS V
JOIN Unija AS U ON U.id = V.ident
ORDER BY U.RedosledTabela, V.ident
;


Unija to donese 20 redova, 10 iz web_fix_table, i jos 10 iz web_view, ukupno 20.
U uniji, dodali smo kolonu RadosledTabela, vrednost =1 za web_fix_table, 2 za web_view.
-
Onda se to JOINuje sa _glavni_view. JOIN ima isti efekat kao "WHERE ident IN" uz dodatnu povoljnost da mozes da ukljucis u rezultujuci skup kolone iz oba ulazna skupa. Dakle, ukljucimo kolonu Unija.RedosledTabela i po njoj sortiramo izlaz.

Ovde ima jedan problem - Unija vraca 20 redova, po 10 iz oba seta. Ako sada od toga zelis TOP 10, pa poredjane po koloni RedosledTabela, ocigledno ej da ce ti vratiti 10 redova iz web_fix_table. Da li si siguran da na kraju zelis bas "TOP 10 FROM glavni_view"?

 
Odgovor na temu

nadavesela
programer, DZS

Član broj: 199298
Poruke: 93
195.26.131.*



+3 Profil

icon Re: Unija dve tabele sa14.03.2011. u 13:56 - pre 158 meseci
ja bih uniju napisala kao subquery

SELECT TOP 10 * FROM _glavni_view
WHERE ident in
(
SELECT id from
(
( SELECT top 10 id, 1 as redosled FROM web_fix_table )
UNION
( SELECT top 10 acIdent AS id, 2 as redosled FROM web_view order by NEWID() )
) unija

)

 
Odgovor na temu

Zidar
Canada

Član broj: 15387
Poruke: 3085
*.100.46-69.q9.net.



+79 Profil

icon Re: Unija dve tabele sa14.03.2011. u 14:45 - pre 158 meseci
Ovo je zadatak:
Citat:
Cilj je da se izvuku redovi iz fixne tabele i nekoliko redova iz view-a ALI da se ogranice na 10 redova skupa...
Problem koji mi predtavlja je sto treba PRVO da budu fixni redovi iz FIXNE tabele... a upit mi mesa redove...

Znaci, zavrsni skup treba da je sortiran tako da redovi iz fixne tabele budu pokazani prvo. Da bi to postigli, moramo da znamo koji red dolazi iz koje tabele. A to mozemo jedino ako tamo gde pravimo UNION kveri dopisemo kolonu koja nam kaze odakle dolazi red.
U resenjima sa subqueriejm , WHERE di In.. dozvoljavaj kolone iz samo jedne tabele. Imacemo 10 id vrednosti koje vucemo iz unije, ali nemamo na osnovu cega da ih poredjamo. Zato mora JOIN i zato nam treba kolona RedosledTabela u select izrazima koji cine UNION.

I dalje ostaje pitanje za TOP 10 u konacnom skupu. Ako se vuce iz unije 10 redova, i to tako da oni iz fixne tabele budu prvi, a njih ima tacno 10, onda ce i na izlazu biti tacno 10 redova, svi iz fiksne tabele. U tom slucaju se kveri znatno pojednostavljuje:

Code:
SELECT top 10 id FROM web_fix_table 


ce vratiti isto sto vraca i moje resenje. Ili ja nesto ne vidim sto ostali vide?

TOP 10 sa ORDER BY radi tako sto se prvo skup sortira po ORDER BY, pa se onda uzme prvih 10 redova.

 
Odgovor na temu

Milan M. Radovic
Web Developer
Pančevo

Član broj: 16959
Poruke: 743
82.117.198.*



+25 Profil

icon Re: Unija dve tabele sa14.03.2011. u 14:56 - pre 158 meseci
Citat:
nadavesela: ja bih uniju napisala kao subquery

SELECT TOP 10 * FROM _glavni_view
WHERE ident in
(
SELECT id from
(
( SELECT top 10 id, 1 as redosled FROM web_fix_table )
UNION
( SELECT top 10 acIdent AS id, 2 as redosled FROM web_view order by NEWID() )
) unija

)


Ovde je sve super - sem sto ponovo zezne redosled..... mada mi nije jasno kako :(
I don't need a girl for sex , All I Need is Binary and HEX
 
Odgovor na temu

nadavesela
programer, DZS

Član broj: 199298
Poruke: 93
195.26.131.*



+3 Profil

icon Re: Unija dve tabele sa14.03.2011. u 15:05 - pre 158 meseci
order by NEWID() na koji deo se odnosi, na union ili na web_view
 
Odgovor na temu

nadavesela
programer, DZS

Član broj: 199298
Poruke: 93
195.26.131.*



+3 Profil

icon Re: Unija dve tabele sa14.03.2011. u 15:16 - pre 158 meseci
Dali moze nesto ovakvo:

SELECT TOP 10 * FROM _glavni_view
WHERE ident in
(
SELECT id from
(
( SELECT top 10 id, 1 as redosled FROM web_fix_table )
UNION
( SELECT top 10 acIdent AS id, 2 as redosled FROM web_view order by NEWID() )

) unija
order by redosled,id
)
 
Odgovor na temu

nadavesela
programer, DZS

Član broj: 199298
Poruke: 93
195.26.131.*



+3 Profil

icon Re: Unija dve tabele sa14.03.2011. u 15:27 - pre 158 meseci
Mozda top 10 ne treba u union selectima

SELECT TOP 10 * FROM _glavni_view
WHERE ident in
(
SELECT id from
(
( SELECT id, 1 as redosled FROM web_fix_table )
UNION
( SELECT acIdent AS id, 2 as redosled FROM web_view order by NEWID() )

) unija
order by redosled,id
)
 
Odgovor na temu

Zidar
Canada

Član broj: 15387
Poruke: 3085
*.100.46-69.q9.net.



+79 Profil

icon Re: Unija dve tabele sa14.03.2011. u 19:39 - pre 158 meseci
Ovo postaje ozbiljno Niko ne voli JOIN, a bez JOIN ne ide. Nezgodan neki kveri

Subquery ne dozvoljava ORDER BY ako nema TOP pa poslednji Nadin predlog nece moci da prodje ini sintaksnu proveru.

Cak i kad bi subkveri dozvolio ORDER BY, dobili biste sve redove iz fiksne tabele prvo, pa onda redove iz view-a, u okviru subkquery.
Medjutim, nema garncije da bi vanjski kveri (FROM _glavni_view..) vratio redove u pravom reosledu - jer redosled nismo ni definisali. U MS SQL, ako se ne definise redosled zavrsnog kverija sa ORDER BY, NEMA GARANCIJE da ce se redovi pojaviti u bilo kakvom redosledu. A ne mozemo definisati redosled u vanjskom kveriju po koloni iz subkverija. Zato je izmisljen JOIN.....

Vanjski kveri mora da kaze "SELECT TOP 10 FROM _glavni_view ORDER BY Unija.Redosled" a to ne moze bez JOIN...




 
Odgovor na temu

nadavesela
programer, DZS

Član broj: 199298
Poruke: 93
195.26.131.*



+3 Profil

icon Re: Unija dve tabele sa15.03.2011. u 08:18 - pre 158 meseci
Zidar, slazem se da zadnji queri ne prolazi zbog

(SELECT acIdent AS id, 2 as redosled FROM web_view order by NEWID())

umesto

(SELECT top 10 acIdent AS id, 2 as redosled FROM web_view order by NEWID())

zato sami prethodno pitala na sta se odnosi order po NEWID().

Znaci sto se tice subquerija bar sintaksno je ispravno

SELECT TOP 10 * FROM _glavni_view
WHERE ident in
(
SELECT top 10 id from
(
( SELECT id, 1 as redosled FROM web_fix_table )
UNION
( SELECT TOP 10 acIdent AS id, 2 as redosled FROM web_view order by NEWID() )

) unija
order by redosled,id
)

Sto se tice
SELECT TOP 10 FROM _glavni_view ORDER BY Unija.Redosled
dali previdjas uslov WHERE ident in koji se odnosi na subquery unija.

ocigledno prepravljamo query koji iz starta bas nismo razumeli sta se zeli, odnosno prepravljamo queri koji je mozda pogresno postavljen, kojih TOP 10 zelimo, i odakle
 
Odgovor na temu

Milan M. Radovic
Web Developer
Pančevo

Član broj: 16959
Poruke: 743
82.117.198.*



+25 Profil

icon Re: Unija dve tabele sa15.03.2011. u 10:16 - pre 158 meseci
Hvala :)
I don't need a girl for sex , All I Need is Binary and HEX
 
Odgovor na temu

nadavesela
programer, DZS

Član broj: 199298
Poruke: 93
195.26.131.*



+3 Profil

icon Re: Unija dve tabele sa15.03.2011. u 14:05 - pre 158 meseci
Da nije u pitanju top 10 lista posetilaca teme
 
Odgovor na temu

Zidar
Canada

Član broj: 15387
Poruke: 3085
*.100.46-69.q9.net.



+79 Profil

icon Re: Unija dve tabele sa15.03.2011. u 14:26 - pre 158 meseci
@nadavesela
Ajde da isteramo stvar do kraja :-)

Sada je sintaksa ispravna, OK:
Citat:

SELECT TOP 10 * FROM _glavni_view
WHERE ident in
(
SELECT top 10 id from
(
( SELECT id, 1 as redosled FROM web_fix_table )
UNION
( SELECT TOP 10 acIdent AS id, 2 as redosled FROM web_view order by NEWID() )

) unija
order by redosled,id
)


Originalni kveri koji si postavila nije imao SELECT TOP u delu unije koji cita iz web_view, zato sam se bunio za sintaksu. Sada je OK, sintaksno.

Medjutim, jos uvek nema garancije da ce glavni kveri vratiti ispravan redosled. Jos jedno medjutim, to ipak moze da bude dovoljno dobro za postavljaca pitanja, zavisi od samih podataka.

Da proanaliziramo poslednji kveri koji si napisala. Malo sam ga formatirao, da se lakse vidi sta je sta. Evo ga kveri:
Code:

SELECT TOP 10 * FROM _glavni_view    --- glavni kveri
WHERE ident in
                (
                SELECT TOP 10 id -- subquery nivo 1
                FROM
                    (-- unija = subquery nivo 2
                    SELECT id, 1 as redosled FROM web_fix_table  
                    UNION
                    SELECT TOP 10 acIdent AS id, 2 as redosled FROM web_view order by NEWID()
                    ) AS unija 
                order by redosled,id
                )


subquery unija ce vartiti 1) sve redove iz web_fix_table 2) 10 slucajno izabranih redova iz web_view

subquery nivo 1 ce vratiti 10 prvih redova iz unije, tako da ce se prvo pojaviti redovi iz web_fix_table
(Redosled=1) pa onda redovi iz web_view (Redosled = 2). Ako tabela web_fix_table sadrzi 10 ili vise redova, onda se redovi iz web_view dela unije nece uopste pojaviti u subquery nivo 1

Glavni kveri jednostavno povuce TOP 10 iz subquery nivo 1. Posto subquery nivo 1 moze imati maksimalno 10 redova, onda ispada da nam glavni kveri i ne treba. Ako subquery nivo 1 ima deset redova, onda ce oni svi biti iz web_fix_table
. Zbog toga mi je TOP 10 u subquery nivo 1 jako sumnjivo, kao i TOP 10 u glavnom kveriju.

Znaci, ako web_fix_table ima vise od 9 redova, onda nam se redovi iz web_view nikada nece videti na izlazu. To nije razumna propozicija, pa verujam da nam postavljac teme nije rekao bas sve.

Ako ne bi bilo TOP 10 u " subquery nivo 1 " onda se moze govoriti o redosledu u glavnom kveriju. Tad bi glavni kveri povlacio sve redove iz " subquery nivo 1 ", verovatno bi ih bilo vise od 10 ukupno, i normalno, zeleli bismo da ih vidimo u zeljenom redosledu. Ocigledno je da nam onda treba unija.redosled i na tom zavrsnom nivou. Tehnicki, ne mora JOIN da se upotrebi da se Unija digne na nivo glavnog kverija, moze i subquery, ali je znatno slozeniji nego sto sada imamo, tako da JOIN na kraju verovatno dodje jeftinije i lakse za pisanje resenje.

Ako nam sad @nada pokaze reenje sa subquerijem, tako da ne moramo JOIN, imacemo dodatni alat u arsenalu, ili bar kako se ista stvar moze resiti na vise nacina. Uvek je moguce da u datoj situaciji jedno resenje bude efikasnije od drugog. Ali, kada se situacija promeni, moze biti obrnuto. Zato je lepo imati vise resanja, sloboda izbora je velika stvar.

:-)


 
Odgovor na temu

nadavesela
programer, DZS

Član broj: 199298
Poruke: 93
195.26.131.*



+3 Profil

icon Re: Unija dve tabele sa15.03.2011. u 14:43 - pre 158 meseci
Zidar slazem se u potpunosti sa tvojom analizom. Subquery je bio prilagodjen prvom queriju i uslovu WHERE ident in.
Glavni kveri mu treba, da mu da sve podatke iz _glavni_view, a slazem se da mu ne treba TOP 10 jedino ako ne misli neki novi order da ima nad _glavni_view
A da bih kao neko opste resenje i ja pisala preko JOINA, EXIST... uz pomoc odgovarajucih Subquerije :)
Moze al i ne mora preko joina (nadam se )

SELECT TOP 10 * FROM
(
SELECT *,1 as redosled FROM _glavni_view
WHERE ident in ( SELECT id FROM web_fix_table )
UNION
SELECT *,2 as redosled FROM _glavni_view
WHERE ident in ( SELECT TOP 10 acIdent AS id FROM web_view order by NEWID() )
) u
ORDER BY u.redosled,u.Ident

Mislim da je poenta filtrirati _glavni_view prema ident koji se nalazi u web_fix_table (moze i vise od 10, a moze se i ograniciti na 10),
takodje filtrirati _glavni_view prema ident koji se nalaze u web_view (koje smo ogranicili do 10), i iz dobijenog skupa da poredjamo po prioritetu redosleda, Ident.
Za razliku od prethodnog querija za dobijeni skup ne mozemo top 10 poredjati po nekom drugom uslovu.
Nadam se da nemam sintaksnih gresaka, a svaku drugu zabelesku sa zadovoljstvom ocekujem.

[Ovu poruku je menjao nadavesela dana 15.03.2011. u 18:45 GMT+1]
 
Odgovor na temu

[es] :: MS SQL :: Unija dve tabele sa

[ Pregleda: 2511 | Odgovora: 14 ] > FB > Twit

Postavi temu Odgovori

Navigacija
Lista poslednjih: 16, 32, 64, 128 poruka.