[ 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.