sql >> Database >  >> RDS >> Sqlserver

Hoe tabellen te kopiëren en cursors in SQL te vermijden?

U kunt de output-clausule gebruiken met de merge-instructie om een ​​toewijzing te krijgen tussen bron-ID en doel-ID. Beschreven in deze vraag. Gebruik merge..output om een ​​mapping te krijgen tussen source.id en target.id

Hier is wat code die je kunt testen. Ik gebruik tabelvariabelen in plaats van echte tabellen.

Voorbeeldgegevens instellen:

-- @A and @B is the source tables
declare @A as table
(
  id int,
  FK_A_B int,
  name varchar(10)
)

declare @B as table
(
  id int,
  visible bit
)  

-- Sample data in @A and @B
insert into @B values (21, 1),(32, 0)
insert into @A values (1, 21, 'n1'),(5, 32, 'n2')


-- @C and @D is the target tables with id as identity columns
declare @C as table
(
  id int identity,
  FK_C_D int not null,
  name varchar(10)
)

declare @D as table
(
  id int identity,
  visible bit
)  

-- Sample data already in @C and @D
insert into @D values (1),(0)
insert into @C values (1, 'x1'),(1, 'x2'),(2, 'x3')

Gegevens kopiëren:

-- The @IdMap is a table that holds the mapping between
-- the @B.id and @D.id (@D.id is an identity column)
declare @IdMap table(TargetID int, SourceID int)

-- Merge from @B to @D.
merge @D as D             -- Target table
using @B as B             -- Source table
on 0=1                    -- 0=1 means that there are no matches for merge
when not matched then
  insert (visible) values(visible)    -- Insert to @D
output inserted.id, B.id into @IdMap; -- Capture the newly created inserted.id and
                                      -- map that to the source (@B.id)

-- Add rows to @C from @A with a join to
-- @IdMap to get the new id for the FK relation
insert into @C(FK_C_D, name)
select I.TargetID, A.name 
from @A as A
  inner join @IdMap as I
    on A.FK_A_B = I.SourceID

Resultaat:

select *
from @D as D
  inner join @C as C
    on D.id = C.FK_C_D

id          visible id          FK_C_D      name
----------- ------- ----------- ----------- ----------
1           1       1           1           x1
1           1       2           1           x2
2           0       3           2           x3
3           1       4           3           n1
4           0       5           4           n2

Je kunt de code hier testen:https://data.stackexchange.com/stackoverflow/q/101643/using-merge-to-map-source-id-to-target-id



  1. initialiseer een sqlite-database android

  2. ORA-1114 Datapatch uitvoeren

  3. Vind overlap van datumbereiken binnen dezelfde tabel, voor specifieke gebruiker MySQL

  4. Het invoegen van gegevens van CSV in MySQL DB is erg traag