Вставить на дочернюю таблицу и обновить FK на родительской - PullRequest
0 голосов
/ 30 мая 2019

У меня есть родительская таблица со следующей структурой и данными:

---------------------------------------------
|  Id | TranslationId |                Name |
---------------------------------------------
|   1 |          NULL |          Image1.jpg |
|   2 |          NULL |          Image7.jpg |
|   3 |          NULL |    Picture_Test.png |
---------------------------------------------

И пустая дочерняя таблица, которая содержит переведенные изображения:

-------------------------------------------------------------------------
|  Id |                  De |                  Fr |                  En |
-------------------------------------------------------------------------
|     |                     |                     |                     |
-------------------------------------------------------------------------

Теперь я ищуодин оператор запроса или, по крайней мере, несколько запросов, которые я могу запустить без какого-либо дальнейшего программирования.Выполнение этой работы с помощью сценариев или программирования было бы легко, но у меня часто бывают ситуации, когда мне нужен такой вид вставки / обновления.И разрабатывать каждый раз маленькое консольное приложение невозможно.

В конце две таблицы должны выглядеть так:

---------------------------------------------
|  Id | TranslationId |                Name |
---------------------------------------------
|   1 |            28 |                NULL |
|   2 |            29 |                NULL |
|   3 |            30 |                NULL |
---------------------------------------------
-------------------------------------------------------------------------
|  Id |                  De |                  Fr |                  En |
-------------------------------------------------------------------------
|  28 |          Image1.jpg |                NULL |               NULL  |
|  29 |          Image7.jpg |                NULL |               NULL  |
|  30 |    Picture_Test.png |                NULL |               NULL  |
-------------------------------------------------------------------------

Спасибо за любые советы.

Ответы [ 3 ]

1 голос
/ 30 мая 2019

Демо, предполагая, что Имя уникально в первой таблице

create table tab1 (
  id int identity
 ,TranslationId int null
 ,Name nvarchar(max) null
 );
 insert tab1 (Name)
     values 
     ('Image1.jpg')
    ,('Image7.jpg')
    ,('Picture_Test.png')
    ,(null)

create table tab2 (
  id int identity (100,1)
 ,De nvarchar(max) null
 ,Fr nvarchar(max) null
 ,En nvarchar(max) null
 );

-- Update them 

declare @map table(
  name nvarchar(max) 
 ,ref int
  );

insert tab2 (de)
output inserted.De, inserted.id
into @map(Name, ref)
select Name
from tab1 src
where Name is not null and not exists (select 1 from tab2 t2 where t2.De = src.Name);

update t1 set TranslationId = ref, Name = null
from tab1 t1
join @map m on t1.Name = m.Name;

select * from tab1;
select * from tab2;
1 голос
/ 30 мая 2019

Вы можете сделать что-то вроде следующего:

INSERT INTO Child
(
   Id
   ,De
   ,Fr
   ,En
)
OUTPUT Inserted.Id INTO #Temp
SELECT Id
       ,De
       ,Fr
       ,En
FROM @Values --If you are using a table type to insert into the Child table as a set based approach

;WITH CTE
AS
(
  SELECT ROW_NUMBER() OVER(ORDER BY Id) AS Rnk
  ,Id
  FROM #Temp

)
,CTE1 AS
(
  SELECT ROW_NUMBER() OVER(ORDER BY Id) AS Rnk
  ,*
  FROM Parent
)

UPDATE cte1
SET TranslationId = cte.Id
FROM CTE1 cte1
JOIN CTE cte ON cte.Rnk = cte1.Rnk
0 голосов
/ 30 мая 2019

Я тем временем разобрался, как это сделать. Применительно к базе данных запрос выглядит так:

DECLARE @Temp TABLE (ImageId INT, Id INT)

MERGE INTO Translation USING 
  (
  SELECT Image.Name AS Name, Image.Id AS ImageId
  FROM Candidate
  INNER JOIN Candidacy ON Candidate.Id = Candidacy.CandidateId
  INNER JOIN Election ON Candidacy.ElectionId = Election.Id
  INNER JOIN SmartVoteCandidate ON Candidate.Id = SmartVoteCandidate.CandidateId
  INNER JOIN Image ON SmartVoteCandidate.SpiderImageId = Image.Id
  WHERE Election.Id = 1575) AS temp ON 1 = 0
WHEN NOT MATCHED THEN
  INSERT (De)
  VALUES (temp.Name)
  OUTPUT temp.ImageId, INSERTED.Id
  INTO @Temp (ImageId, Id);

UPDATE Image
SET Image.TranslationId = t.Id, Name = NULL
FROM @Temp t
WHERE Image.Id = t.ImageId

Решение вдохновлено

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