Обновите таблицу и вставьте отсутствующие записи - PullRequest
0 голосов
/ 12 июня 2018

У меня есть таблица со столбцом внешнего ключа с некоторыми записями NULL.Я могу выбрать записи с отсутствующим столбцом, такие как:

SELECT * FROM Outgoing WHERE Receipt_Id IS NULL

Теперь для каждой из этих записей я хочу вставить новую запись в таблицу Receipts, получить вставленную запись Id и установить еев качестве значения Receipt_Id в этой записи.

Возможно ли это в запросе?

Ответы [ 2 ]

0 голосов
/ 12 июня 2018

Обновление: Поскольку вы используете таблицу Receipt только в качестве таблицы последовательности.Вы должны следовать обновленному подходу, в котором используются последовательности

Обновленный ответ:

Все, что вам нужно сделать, - это создать последовательность, скажем, Получение, а не таблицу с одним столбцом.А затем обновите исходящую таблицу с порядковыми номерами.

   --create table Outgoing ( id int Primary Key IDENTITY(1,1),data nvarchar(100), record_id int);
--insert into Outgoing values ('john',NULL),('jane',NULL),('jean',NULL);

create sequence dbo.receipts as int start with 1 increment by 1;

update Outgoing
set record_id= NEXT VALUE FOR dbo.receipts
where record_id is null

select * from Outgoing

См. Рабочую демонстрацию

СтарыйОтвет ниже

Если у вас есть столбец ID в обеих таблицах, вы можете обновить Receipt_Id на основе этого столбца обратно в таблицу Outgoing

Таким образом, вы выполняете следующие шаги: 1. вставлять записи

DECLARE @LastRID bigint 
SELECT @LastRID= MAX(Id) FROM Receipts
INSERT INTO Receipts(<col list>)
SELECT <col list> FROM Outgoing WHERE Receipt_Id IS NULL

обновлять записи, основываясь на уникальности всех столбцов, вставленных из исходящих в чеки, используя CHECKSUM функцию

update O
set O.Receipt_Id=R.Id
From Outgoing  O
Join Receipts R 
on CHECKSUM(o.<col list>)=CHECKSUM(R.<col list>)
and R.Id>@LastRID
0 голосов
/ 12 июня 2018

Кажется, вы ищете inserted таблицу

INSERT INTO Receipts (col1, col2....)
OUTPUT INSERTED.*
INTO @CreatedIds -- TEMP TABLE WHICH HOLDS RECENTLY INERTED DATA INCLUDING Receipt_Id (pk)
SELECT col1, col2.... 
FROM Outgoing 
WHERE Receipt_Id IS NULL

Чтобы просмотреть недавно добавленные записи

SELECT c.*
FROM @CreatedIds c -- Note this is a table variable that you need to manual create.
...