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

SELECT za jednostavno spajanje dve tabele ?

[es] :: Baze podataka :: SELECT za jednostavno spajanje dve tabele ?

[ Pregleda: 2960 | Odgovora: 7 ] > FB > Twit

Postavi temu Odgovori

Autor

Pretraga teme: Traži
Markiranje Štampanje RSS

DarkMan
Darko Matesic

Član broj: 20445
Poruke: 572
195.252.80.*

Jabber: DarkMan


Profil

icon SELECT za jednostavno spajanje dve tabele ?15.10.2004. u 13:02 - pre 237 meseci
U pitanju je triger u MSSQL.
Dakle imam dve tabele sa istom strukturom i istom kolicinom podataka (isti broj redova).
U pitanju su DELETED i INSERTED tabele.
Prva sadrzi stare podatke a druga nove podatke.
Zbog toga sto su moguce izmene i u kljucu, jedina veza izmedju ovih tabela je red podatka (prvi red iz DELETED je u vezi sa prvim redom INSERTED).
Da li je moguce koriscenjem samo jedne SELECT naredbe spojiti ove dve tabele u novu koja ce imati isti broj redova kao i pocetne ali tako da svaki njen red sadrzi podatke iz jedne i druge tabele ?
Da demonstriram primerom sta hocu:
Code:

     tabela INSERTED              tabela DELETED
SIFRA       KOLICINA           SIFRA       KOLICINA
----------- ----------         ----------- ---------- 
1           1.00               5           11.00
2           7.00               6           15.00
3           9.00               7           23.00

hocu da dobijem ovakvu tabelu (izlaz)
I_SIFRA     I_KOLICINA D_SIFRA     D_KOLICINA
----------- ---------- ----------- ---------- 
1           1.00       5           11.00
2           7.00       6           15.00
3           9.00       7           23.00


Ja imam neko resenje koriscenjem privremenih tabela ali me bas zanima da li je moguce jednostavnije. Evo i mog resenja:
Code:

SELECT IDENTITY(int,1,1) AS SID, * INTO #INS FROM INSERTED
SELECT IDENTITY(int,1,1) AS SID, * INTO #DEL FROM DELETED
SELECT I.SIFRA AS I_SIFRA, I.KOLICINA AS I_KOLICINA,
       D.SIFRA AS D_SIFRA, D.KOLICINA AS D_KOLICINA
   FROM #DEL D INNER JOIN #INS I ON D.SID = I.SID
 
Odgovor na temu

Zidar
Canada

Član broj: 15387
Poruke: 3085
*.eqao.com.



+79 Profil

icon Re: SELECT za jednostavno spajanje dve tabele ?15.10.2004. u 18:07 - pre 237 meseci
Stani malo. Inseretd i Deleted JESU povezane. Inserted se interno kreira kada INSERTujes rekorde. Kada radis DELETE kreira se samo Deleted. Kada radis UPDATE kreiraju se obe tabele. U slucaju UPDATE, deleted sadrzi stare rekorde, pre nego sto se UPDATE izvrsilo, Inserted sadrzi nove rekorde, posle UPDATE. AKo tabela ima Primary Key, rekordi u Inserted i Deleted imaju isti PK. Znaci,

SELECT I.*, D.*
FROM Inserted AS I
INNER JOIN Deleted AS D OM I.PKfield=D.PKfield

treba da ti odradi posao.

:-)
 
Odgovor na temu

DarkMan
Darko Matesic

Član broj: 20445
Poruke: 572
*.smin.sezampro.yu.

Jabber: DarkMan


Profil

icon Re: SELECT za jednostavno spajanje dve tabele ?15.10.2004. u 22:45 - pre 237 meseci
Citat:
Zidar
SELECT I.*, D.*
FROM Inserted AS I
INNER JOIN Deleted AS D OM I.PKfield=D.PKfield


Prvo sam pomislio kada si dao odgovor da ovo PKfiled je standardna kolona za INSERTED i DELETED koja se dodaje pored ostalih kolona ali to ne postoji i ovo gore ne funkcionise.
Bilo bi mi lepo kada bih znao da mi se kljuc u tabeli nece menjati pa mogu da odradim jedan JOIN i to je to.
Ali u mom slucaju, kao i u primeru koji sam naveo, kljuc se moze promeniti te tako nema sanse da spojim ove dve tabele onako kako zelim.
 
Odgovor na temu

Zidar
Canada

Član broj: 15387
Poruke: 3085
*.eqao.com.



+79 Profil

icon Re: SELECT za jednostavno spajanje dve tabele ?18.10.2004. u 14:29 - pre 237 meseci
SQL je relaciona baza. Jedna od osobina relacionih baza je da se Primery Key NE MENJA za zivota baze, ili se to cini veoma retko, u specijalnim slucajevima i onda se to veoma pazljivo radi. Ako ti imas tabelu u kojoj se PK menja redovno, tu imamo daleko veci problem nego sto ti izgleda. U relacionoj bazi, svaka tabela je ili parent ili child. Ako je tabela parent, i ima neke child records, propisno dizajnirana baza NE DOZVOLJAVA promenu PK.

Ako je tabela tipa Child, onda moze da se promeni PK, ali to samo znaci da je rekord promenio roditelja. To se desava, ali se to pazljivo radi, obicno jedan rekord po jedan, i to se planira unapred. Ako se planira mogucnost promene PK, onda je najbolje imati jos jedno polje ili kombinaciju polja koje odredjuju rekord jedinstveno (Alternate Key, AK) i taj alternate kay se NE MENJA NIKADA. Onda lepo upotrebis AK za povezivanje Insert i Delete tabele i sve je OK. U stvarnosti, ispada onda da je tvoje polje samo neki prividni PK, a pravi PK jeste AK koji se jednom dodeli rekordu i ne mejna se do kraja zivota. U SQL Serveru, za AK mozes da upotrebix data type int ili bigint i da setujes Identity property za to polje i to ti radi otprilike kao AutoNumber u Accessu.

:-)
 
Odgovor na temu

DarkMan
Darko Matesic

Član broj: 20445
Poruke: 572
195.252.80.*

Jabber: DarkMan


Profil

icon Re: SELECT za jednostavno spajanje dve tabele ?18.10.2004. u 16:53 - pre 237 meseci
U pitanju je child tabela.
Konkretno to je tabela sa stavkama naloga.
Deo kljuca je kljuc naloga koji se ne menja i kljuc artikla koji moze da se menja (dok se jos unose stavke u nalog).
Dakle sve su u pitanju foreign kljucevi.
 
Odgovor na temu

Zidar
Canada

Član broj: 15387
Poruke: 3085
*.eqao.com.



+79 Profil

icon Re: SELECT za jednostavno spajanje dve tabele ?18.10.2004. u 18:48 - pre 237 meseci
Preporucujem jedan od dva nacina:
a) zabranjeno menjanje kljuca u tabeli StavkeNaloga. Ako je neko uneo artikal A, kolicina 30 pa se predomislio i sad zeli da to bude artikal B kolicina 25, to treba zabraniti i naterati korisnika da obrise artikal A i da onda unese novi rekord sa korektnim artiklom B. Sve se desava dok se nalog puni artiklima, pa ne smeta da se pise i brise. Kad se jednom nalog zavrsi (uneo si sve stavke), onda vise nema menjanja. Ako bas mora da se menja, opet brisi pa pisi ponovo. Cim ti imas potrebu da menjas stavke tokom rada, znaci da korisnik ne zna tacno sta hoce i velike su mogucnosti za kasnije "jesam/nisam uneo" probleme. To se najlakse prati tako sto zabranis menjanje, omogucis brisanje, a svaki obrisani rekord na primer sacuvas u nekoj tabeli StavkeNaloga_History.

b) dozvoljeno menjanje: dodaj jedno polje, identity u tabelu StavkeNaloga, koje je UNIQUE za celu tabelu. Onda ces imati dva kljuca kljuc1 (NalokgID, StavkaID) i Kljuc2 (IdentityPolje). Kljuc1 se moze menjati (samo deo StavkaID), Kljuc2 se ne moze menjati, sve i da hoces. Onda koristi IdentityPolje kao pravi nepromenljivi PK da napravis JOIN izmedju Inserted i Deleted. Opet je preporucljivo da sve promenjene rekorde strpas u history tabelu.

Meni se vise dopada a), jer zahteva odredjenu disciplinu kod korisnika i cini mi se da se lakse ide unazad kada zatreba, nego resenje b). Napominjem i resenje B) ce da radi, ali ce History tabela da bude kompleksnija - treba da znas sta je bilo UPDATE a sta je bilo DELETE.

:-)
 
Odgovor na temu

shonev
Beograd

Član broj: 38508
Poruke: 25
*.korisnici.absolutok.com.

Sajt: tesla.rcub.bg.ac.yu/~shon..


Profil

icon Re: SELECT za jednostavno spajanje dve tabele ?08.11.2004. u 13:45 - pre 236 meseci
SAVET!

Ukoliko imas tabele sa velikim brojem slogova,
preporucujem ugnjezdene upite.

----------------------
select ....
from ....
where xxx=( select
from
where yyy=...)
----------------------

Radi brze jer koristis prvo restrikciju, a ne Dekartov proizvod.
 
Odgovor na temu

DarkMan
Darko Matesic

Član broj: 20445
Poruke: 572
*.metrohive.neobee.net.

Jabber: DarkMan


Profil

icon Re: SELECT za jednostavno spajanje dve tabele ?08.11.2004. u 16:15 - pre 236 meseci
Citat:
shonev: SAVET!

Ukoliko imas tabele sa velikim brojem slogova,
preporucujem ugnjezdene upite.

----------------------
select ....
from ....
where xxx=( select
from
where yyy=...)
----------------------

Radi brze jer koristis prvo restrikciju, a ne Dekartov proizvod.

Nisi me razumeo (procitaj bolje problem). Nije mi ni potreban dekartov proizvod, niti mi pomaze ovo sto si napisao.
 
Odgovor na temu

[es] :: Baze podataka :: SELECT za jednostavno spajanje dve tabele ?

[ Pregleda: 2960 | Odgovora: 7 ] > FB > Twit

Postavi temu Odgovori

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