Вставить записи из одной таблицы в другую таблицу, увеличивая идентификатор - PullRequest
1 голос
/ 11 декабря 2019

Как вставить записи из одной таблицы (таблицы1) в одну и ту же таблицу (таблицу2) в другой базе данных SQL?

Однако таблица назначения уже существует и имеет записи с тем же идентификатором (c1). записи таблицы1 должны быть добавлены в таблицу2, но я должен увеличить поле (c1).

таблица 1

C1;C2;C3;
1;Name 1;Address 1;
2;Name 2;Address 2;
3;Name 3;Address 3;
4;Name 4;Address 4;

таблица 2

C1;C2;C3 ;
1;Name 11;Address 11;
2;Name 12;Address 12;
3;Name 13;Address 13;
4;Name 14;Address 14;
5;Name 1;Address 1;
6;Name 2;Address 2;
7;Name 3;Address 3;
8;Name 4;Address 4;

что не так? таблица cl одинакова в обеих базах данных и в следующих столбцах: (clstamp, nome, no, instal, vendnm, ncont)

INSERT INTO DB2..cl(clstamp, nome, estab, vendnm, ncont)
    select clstamp, nome, estab, vendnm, ncont
      FROM         [DB1]..[cl]
      LEFT JOIN    [DB2]..[cl] ON [DB1]..[cl].clstamp=[DB2]..[cl].clstamp 
      and [DB1]..[cl].nome=[DB2]..[cl].nome 
      and [DB1]..[cl].estab=[DB2]..[cl].estab 
      and [DB1]..[cl].vendm=[DB2]..[cl].vendnm 
      and [DB1]..[cl].ncont=[DB2]..[cl].ncont
    where [DB1]..cl.ncont not in (select ncont from [DB2]..cl) 
    order by [DB2]..[cl].no

Ответы [ 3 ]

1 голос
/ 11 декабря 2019

Если ваши базы данных находятся на одном и том же сервере, а в таблице 2 столбец C1 помечен как столбец идентификаторов, то обычно вы можете выполнить простой оператор SQL:

INSERT INTO database2..table2(C2, C3)
SELECT C2, C3
FROM database1..table1
ORDER BY C1 ASC
0 голосов
/ 12 декабря 2019

Если вы не добавили вручную какие-либо настройки, такие как IDENTITY_INSERT, все вставленные записи, естественно, получат инкрементные идентификаторы.

Как вы уже описали, проблема, с которой вы здесь столкнулись, это дубликаты записей , которые нарушают ваше ограничение PRIMARY KEY .

Самый простой способ - использовать оператор MERGE. MERGE INTO Таблица 2 USING Таблица 1. WHEN MATCHED ничего не делать и вставлять записи, когда UNMATCHED

Также имейте в виду, что если вы DELETE любых записей, удаленный идентификатор не будетпереработано для вновь вставленных рядов. Таким образом, проверьте таблицу, если хотите, чтобы исходные идентификаторы и вставленные идентификаторы текли непрерывно

0 голосов
/ 11 декабря 2019

Если вы хотите избежать вставки повторяющихся строк, попробуйте следующее:

INSERT INTO database2..myTable2 (C2, C3)
        select t1.c2, t1.c3
          FROM         [database1]..[table1] t1
          LEFT JOIN    [database2]..[table2] t2 ON t1.C2 = t2.C2 and t1.C3 = t2.C3
        where t2.c2 is null and t2.c3 is null
        order by t1.C1

Если вы в порядке с дубликатами, то решение уже упоминалось Анджело.

Я пробовал с помощью tempТаблицы и рабочий код ниже:

IF (OBJECT_ID('tempdb..#myTable1') IS NOT NULL)
BEGIN
   DROP TABLE #myTable1
END;

IF (OBJECT_ID('tempdb..#myTable2') IS NOT NULL)
BEGIN
   DROP TABLE #myTable2
END;

CREATE TABLE #myTable1 ([C1] int identity(1,1), [C2]  varchar(10),  [C3]  varchar(10));

CREATE TABLE #myTable2 ([C1] int identity(1,1), [C2]  varchar(10),  [C3]  varchar(10));

Insert INTO #myTable1(C2, C3)
values
 ('Name 1', 'Address 1')
, ('Name 2', 'Address 2')
, ('Name 3', 'Address 3')
, ('Name 4', 'Address 4')

Insert INTO #myTable2(C2, C3)
values
  ('Name 11', 'Address 11')
, ('Name 12', 'Address 12')
, ('Name 13', 'Address 13')
, ('Name 14', 'Address 14')

select * from #myTable1
select * from #myTable2

INSERT INTO #myTable2 (C2, C3)
    select t1.c2, t1.c3
      FROM         [#myTable1] t1
      LEFT JOIN    [#myTable2] t2 ON t1.C2 = t2.C2 and t1.C3 = t2.C3
    where t2.c2 is null and t2.c3 is null
    order by t1.C1

select * from #myTable2
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...