Avatar billede bredum Nybegynder
22. september 2004 - 13:53 Der er 10 kommentarer og
2 løsninger

Replace i MS SQL

Jeg er gået over fra mySQL til Ms SQL, men jeg mangler replace. hvordan gøre dette bedst, jeg har en tabel1 med værdier, den vil jeg opdatere på baggrund af tabel2, de poster i tabel2 som ikke er i tabel1 skal indsættes.

i mySQL kunne jeg bruge sql ="replace into tabel1 values tabel2"

hvordan gør jeg det i ms SQL??? eller kan den ikke det.
Avatar billede arne_v Ekspert
22. september 2004 - 16:44 #1
INSERT INTO tabel1 SELECT * FROM tabel2 WHERE id NOT IN (SELECT id FROM tabel1)
Avatar billede bredum Nybegynder
23. september 2004 - 10:04 #2
denne indsætter kun poster fra tabel2, men opdatere ikke allerede indsat poster i tabel1 som også er i tabel2. Det er jo det en replace gør i mySQL.
Avatar billede gudjon Nybegynder
24. september 2004 - 09:28 #3
Prøv (husk at der skal være indexer på id ellers kan det her tage laaang tid.

SET NOCOUNT ON

DECLARE
@idtabel2 integer
,@feltderskalopdateres datatype

SELECT @idtabel2 = 0
WHILE 1 = 1
BEGIN
  SELECT @idtable2 = MIN(id)
  FROM table2
  WHERE id > @idtabel2

  IF @idtabel2 IS NULL
    BREAK

  IF EXISTS ( SELECT *
              FROM tabel1
              WHERE id = @idtabel2
            )
  BEGIN
    SELECT
    @felter (skal declareres) = tabelfelter (de felter der skal opdateres)
    FROM tabel2
    WHERE id = @idtabel2

    UPDATE tabel1
    SET felter = @felter
    WHERE id = @idtabel2
  END
  ELSE
  BEGIN
    INSERT INTO tabel1
    SELECT
    xxx
    FROM tabel2
    WHERE id = @idtabel2
  END
END
Avatar billede gudjon Nybegynder
24. september 2004 - 09:30 #4
du kan også bruge SELECT i UPDATE
SET felt = (SELECT felt FROM tabel2 WHERE id = @idtabel2)
Avatar billede arne_v Ekspert
24. september 2004 - 09:32 #5
Hvad med:

DELETE FROM tabel1 WHERE id IN (SELECT id FROM tabel2)

og

INSERT INTO tabel1 SELECT * FROM tabel2

?
Avatar billede gudjon Nybegynder
24. september 2004 - 09:35 #6
Hvis du bruger DELETE kan du risikere at fjerne andre værdier i rækker i tabel1, som evt. er blevet opdateret fra en anden kilde.
Avatar billede arne_v Ekspert
24. september 2004 - 10:30 #7
Og det gør MySQL REPLACE ikke ?
Avatar billede gudjon Nybegynder
24. september 2004 - 10:43 #8
Er der værdier i tabel1 som ikke findes i tabel2?
Vil replace i MySQL så udskifte værdier eller hele rækker i tabel1?
Avatar billede bredum Nybegynder
27. september 2004 - 08:22 #9
gudjon->> Så skal jeg lige bruge et svar.
Avatar billede bredum Nybegynder
27. september 2004 - 08:25 #10
REPLACE works exactly like INSERT, except that if an old record in the table has the same value as a new record for a PRIMARY KEY or a UNIQUE index, the old record is deleted before the new record is inserted.
Avatar billede arne_v Ekspert
27. september 2004 - 08:33 #11
Netop - det var derfor jeg mente at DELETE+INSERT kunne bruges.
Avatar billede trer Nybegynder
14. oktober 2004 - 10:31 #12
Et lille tip - join clause fra en select kan anvendes i delete / update etc - det er mere effektivt end brug af IN

a la

delete from table1
from table1 t1 inner join table2 t2
on t1.pk = t2.fk

det gør det også nemt at teste da man blot kan checke hvilke rækker der påvirkes ved at lave en select først og så udskifte alt før from med delete.
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
Computerworld tilbyder specialiserede kurser i database-management

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester