Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Microsoft SQL Server Новый топик    Ответить
 Соответствие автоинкрементных идентификаторов  [new]
Шамиль Фаридович
Member

Откуда: Саратов
Сообщений: 484
Доброго времени суток!
Имеются 2 таблицы
CREATE TABLE [dbo].[tb1](
	[id] [bigint] IDENTITY(1,1) NOT NULL,
	[col1] [int] NULL,
	[col2] [varchar](70) NULL,
	[col3] [varchar](70) NULL)

CREATE TABLE [dbo].[tb2](
	[id] [bigint] IDENTITY(1,1) NOT NULL,
	[col1] [int] NULL,
	[col2] [varchar](70) NULL,
	[col3] [varchar](70) NULL)
Происходит перенос данных из tb2 в tb1
INSERT INTO [dbo].[tb1]
           ([col1]
           ,[col2]
           ,[col3])
select      [col1]
           ,[col2]
           ,[col3]
from tb2

Как получить список пар (tb1.id, tb2.id)?
Microsoft SQL Server 2008 R2 (SP2) - 10.50.4000.0 (X64) 
	Jun 28 2012 08:36:30 
	Copyright (c) Microsoft Corporation
	Standard Edition (64-bit) on Windows NT 6.1 <X64> (Build 7601: Service Pack 1)
24 апр 13, 18:20    [14226367]     Ответить | Цитировать Сообщить модератору
 Re: Соответствие автоинкрементных идентификаторов  [new]
Паганель
Member

Откуда: Винница
Сообщений: 22550
Шамиль Фаридович
Происходит перенос данных из tb2 в tb1
tb1 перед этим пустая?
24 апр 13, 18:22    [14226372]     Ответить | Цитировать Сообщить модератору
 Re: Соответствие автоинкрементных идентификаторов  [new]
Шамиль Фаридович
Member

Откуда: Саратов
Сообщений: 484
Нет, не пустая.
и
SET IDENTITY_INSERT tb1 ON

мне не подходит.
24 апр 13, 18:25    [14226388]     Ответить | Цитировать Сообщить модератору
 Re: Соответствие автоинкрементных идентификаторов  [new]
Гавриленко Сергей Алексеевич
Member

Откуда: Moscow
Сообщений: 37228
Добавить во вставляемую таблицу поле tb2_id и получить соответствие через output-кляузу.
24 апр 13, 18:25    [14226389]     Ответить | Цитировать Сообщить модератору
 Re: Соответствие автоинкрементных идентификаторов  [new]
Шамиль Фаридович
Member

Откуда: Саратов
Сообщений: 484
Это решение мне приходило в голову, но не хотелось бы править целевую таблицу. Есть еще варианты?
24 апр 13, 18:29    [14226410]     Ответить | Цитировать Сообщить модератору
 Re: Соответствие автоинкрементных идентификаторов  [new]
Гавриленко Сергей Алексеевич
Member

Откуда: Moscow
Сообщений: 37228
Шамиль Фаридович
Это решение мне приходило в голову, но не хотелось бы править целевую таблицу. Есть еще варианты?
Любой альтернативный ключ.
24 апр 13, 18:30    [14226413]     Ответить | Цитировать Сообщить модератору
 Re: Соответствие автоинкрементных идентификаторов  [new]
Шамиль Фаридович
Member

Откуда: Саратов
Сообщений: 484
К сожалению, без автоинкрементного идентификатора не получается уникального ключа даже по всему списку столбцов.
Приходит в голову вариант с курсором, но он будет медленно работать:(
24 апр 13, 18:34    [14226424]     Ответить | Цитировать Сообщить модератору
 Re: Соответствие автоинкрементных идентификаторов  [new]
Гавриленко Сергей Алексеевич
Member

Откуда: Moscow
Сообщений: 37228
Шамиль Фаридович
К сожалению, без автоинкрементного идентификатора не получается уникального ключа даже по всему списку столбцов.
Приходит в голову вариант с курсором, но он будет медленно работать:(
Тогда по одной записи, да.
24 апр 13, 18:54    [14226490]     Ответить | Цитировать Сообщить модератору
 Re: Соответствие автоинкрементных идентификаторов  [new]
Паганель
Member

Откуда: Винница
Сообщений: 22550
может так
select t1.id, t2.id
  from (select id, col1, col2, col3
              ,row_number() over(partition by col1, col2, col3 order by col1) as rn
          from tb1) as t1
  join (select id, col1, col2, col3
              ,row_number() over(partition by col1, col2, col3 order by col1) as rn
          from tb2) as t2 on t2.col1 = t1.col1
                         and t2.col2 = t1.col2
                         and t2.col3 = t1.col3
                         and t2.rn = t1.rn
?
24 апр 13, 18:59    [14226505]     Ответить | Цитировать Сообщить модератору
 Re: Соответствие автоинкрементных идентификаторов  [new]
HandKot
Member

Откуда: Sergiev Posad
Сообщений: 3034
Шамиль Фаридович
К сожалению, без автоинкрементного идентификатора не получается уникального ключа даже по всему списку столбцов.
Приходит в голову вариант с курсором, но он будет медленно работать:(


так если некоторые записи по всем столбцам одинаковы, то что мешает использовать OPUTPUT?
у меня примерно такая же проблема и решал так

INSERT INTO T1
...
OUTPUT Inserted.ID Into #Tmp

Update #tmp Set
ID2 = ..
FROM Table2


плюс ROW_NUMBER, для разбиения одинаковых записей
24 апр 13, 18:59    [14226506]     Ответить | Цитировать Сообщить модератору
 Re: Соответствие автоинкрементных идентификаторов  [new]
invm
Member

Откуда: Москва
Сообщений: 9724
declare @t1 table (id int not null identity, v int);
declare @t2 table (id int not null identity, v int);

insert into @t1
values
 (1), (2);

insert into @t2
values
 (3), (4);
 
merge into @t2 t
using (select * from @t1) s on s.id is null
when not matched then
 insert (v) values (s.v)
output
 s.id, inserted.id;
24 апр 13, 19:03    [14226521]     Ответить | Цитировать Сообщить модератору
 Re: Соответствие автоинкрементных идентификаторов  [new]
Шамиль Фаридович
Member

Откуда: Саратов
Сообщений: 484
invm,
ваш вариант как раз то, что нужно!
24 апр 13, 19:12    [14226557]     Ответить | Цитировать Сообщить модератору
 Re: Соответствие автоинкрементных идентификаторов  [new]
Мистер Хенки
Member

Откуда: канализация
Сообщений: 6615
Шамиль Фаридович
Это решение мне приходило в голову, но не хотелось бы править целевую таблицу. Есть еще варианты?

через merge и output кляузу. В merge в output можно вставлять значения как из источника так и из целевой таблицы )))
25 апр 13, 09:58    [14228390]     Ответить | Цитировать Сообщить модератору
 Re: Соответствие автоинкрементных идентификаторов  [new]
Шамиль Фаридович
Member

Откуда: Саратов
Сообщений: 484
Если merge используется только для вставки значений и получения соответствия идентификаторов, какое условие лучше использовать в качестве merge_search_condition , заведомо ложное, что-то вроде (1 = 0) ?
merge into @t2 t
using (select * from @t1) s on (1=0)
when not matched then
 insert (v) values (s.v)
output
 s.id, inserted.id;
16 апр 14, 12:44    [15890121]     Ответить | Цитировать Сообщить модератору
 Re: Соответствие автоинкрементных идентификаторов  [new]
HandKot
Member

Откуда: Sergiev Posad
Сообщений: 3034
Шамиль Фаридович
Если merge используется только для вставки значений и получения соответствия идентификаторов, какое условие лучше использовать в качестве merge_search_condition , заведомо ложное, что-то вроде (1 = 0) ?
merge into @t2 t
using (select * from @t1) s on (1=0)
when not matched then
 insert (v) values (s.v)
output
 s.id, inserted.id;


если заведомо ложно, то чем не устраивает обычный INSERT?
16 апр 14, 13:30    [15890428]     Ответить | Цитировать Сообщить модератору
 Re: Соответствие автоинкрементных идентификаторов  [new]
HandKot
Member

Откуда: Sergiev Posad
Сообщений: 3034
HandKot
Шамиль Фаридович
Если merge используется только для вставки значений и получения соответствия идентификаторов, какое условие лучше использовать в качестве merge_search_condition , заведомо ложное, что-то вроде (1 = 0) ?
merge into @t2 t
using (select * from @t1) s on (1=0)
when not matched then
 insert (v) values (s.v)
output
 s.id, inserted.id;


если заведомо ложно, то чем не устраивает обычный INSERT?


понял ограничение инструкции INSERT
16 апр 14, 13:41    [15890509]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить