[ vujkev @ 27.04.2005. 00:34 ] @
| U source tabeli pored svih mogucih polja imam i jedno polje pod nazivom "Lokacija"
U destination tabeli imam:
1. IDLokacije INT IDENTITY PRIMARY KEY
2. NazivLokacije NCHAR
3. OpisLokacije NTEXT
Source tabela moze da ima mnooogo rekorda (trenutna situacija je preko 400000), ali uglavnom samo par različitih lokacija. Potrebno je da:
1. iz source tabele izvucem razlicite lokacije
2. Proverim da li te lokacije postoje u dest tabeli
3. Ako ne postoje da ih upisem u tu tabelu
Nasao sam jedno resenje sa SP, ali mi deluje mnogo komplikovano za ovako jednostavnu operaciju. Postoji li jednostavnije resenje?
Code:
SET NOCOUNT ON
declare @ID Int
declare @lokacija char (100)
declare cur_temp cursor for
select distinct(Lokacija) from tblTest
open cur_temp
fetch next from cur_temp into
@lokacija
while @@FETCH_STATUS=0
begin
if @lokacija is not null
begin
select idLokacije from tblLokacije where NazivLokacije = @lokacija
if @@ROWCOUNT=0
begin
insert into tblLokacije (NazivLokacije) values (@lokacija)
end
end
fetch next from cur_temp into
@lokacija
end
close cur_temp
deallocate cur_temp
|
[ jablan @ 27.04.2005. 07:41 ] @
Hm. Ti se baš naložio na while.
Code:
insert into destination
select distinct lokacija from source
where lokacija not in (select lokacija from destination)
[ vujkev @ 27.04.2005. 10:37 ] @
pa ne znam kako drugacije da uradim :(
Inače ovaj kod što si napisao sam i sam probao odmah na pocetku, ali ne radi. Javlja grešku:
Citat:
Column name or number of supplied values does not match table definition.
Predpostavljam da je to zato sto u dest tabeli imam 3 kolone, a iz source tabele uzimam samo jednu.
[ jablan @ 27.04.2005. 10:47 ] @
Hm pa ne možeš očekivati sve na tacni... Čitaj malo uputstva.
Probaj
Code:
insert into destination
select distinct lokacija, '' from source
where lokacija not in (select lokacija from destination)
[ vujkev @ 27.04.2005. 11:44 ] @
Pa probao sam i to, ali greska je:
Citat:
The text, ntext, or image data type cannot be selected as DISTINCT.
probao sam i
Code:
insert into tblLokacije
select distinct (lokacija), null from tblTest
where lokacija not in (select lokacija from tblLokacije)
ali sa istom greskom
[ jablan @ 27.04.2005. 11:58 ] @
Kapiram.. Možda ćeš morati da iskoristiš jednu temp tabelu
Code:
select distinct lokacija
into #temp
from source
where lokacija not in (select lokacija from destination)
insert into destination
select lokacija, '' from #temp
drop table #temp
[ vujkev @ 27.04.2005. 13:34 ] @
to vec moze. Hvala
[ Zidar @ 29.04.2005. 13:57 ] @
Imas li neki mnogo jak razlog da ti lokacija bude Text tipa? Zar nije mogao neki varchar ili nvarchar? Onda bi ti radio DISTINCT :-)
I jos nesto, kveriji tipa
SELECT Source.Lokacija FROM Source
WHERE Source.Lokacija NOT IN (SELECT Destination.lokacija FROM Destination)
mogu da rade sporo, ako je Destination tabela sa mnogo rekorda. zasto - pa za svaki rekord u Source, mora se izvrsiti subquery (SELECT Destination.lokacija FROM Destination) koji selektuje SVE rekorde iz tabele Destination.
negde sam nasao da je bolje (i uverio se licno) ovako:
SELECT Source.Lokacija FROM Source AS A
WHERE Source.Lokacija NOT EXISTS (SELECT Destination.lokacija FROM Destination AS B WHERE A.Lokaciaj=B.Lokacija)
Zasto? Ponovo se izvrsava subkveri tacno jednom za svaki rekord u Source. Ali, umesto da subkveri vuce SVE rekorde iz Destination, vuci ce samo one gde je Destination.Lokacija=Source.Lokacija
Na malim tabelama verovatno nema veze, ali za 100,000 rekorda u SOurce i 200,000 u Destination zasigurno ima razlike. I jos nesto, budi siguran da imas INDEX na poljima Lokacija u obe tabele. Radi moooogo brze, garantovano.
:-)
[ vujkev @ 29.04.2005. 14:26 ] @
Citat:
Zidar: Imas li neki mnogo jak razlog da ti lokacija bude Text tipa? Zar nije mogao neki varchar ili nvarchar? Onda bi ti radio DISTINCT :-)
Nije mi NazivLokacije nText vec njen opis posto ne znam koliki ce biti maksimalan opis.
Copyright (C) 2001-2025 by www.elitesecurity.org. All rights reserved.