Почему оператор «вставка в выбор» в SQL вставляется как новая строка и вставляется неправильно? - PullRequest
0 голосов
/ 23 апреля 2020

У меня есть таблица 1.

enter image description here

У меня есть еще одна пустая таблица 2 со следующими столбцами.

enter image description here

Я хочу вставить в таблицу 2, выбрав из таблицы 1 - поэтому я пишу запрос как:

insert into table2(employee,id,zone,url) 
select employee, id, zone, concat('https://',employee,'.com/',id,'?',zone) 
from table1

Теперь моя таблица 2 выглядит следующим образом,

enter image description here

Теперь для столбца authcode я делаю следующее и вставляю его в таблицу2.

insert into table2(authcode) 
SELECT CONVERT(VARCHAR(10),HASHBYTES('MD5', substring(URL,8,100)),2) 
from table2.

Но вставка происходит иначе, как это КАК ВСЕ НОВЫЙ НАБОР СТРОК.

enter image description here

Может кто-нибудь помочь мне вставить последний столбец в соответствующие строки вместо его создания новый?

Ответы [ 2 ]

4 голосов
/ 23 апреля 2020

Что вам нужно сделать, это ОБНОВИТЬ таблицу, чтобы заполнить столбец authcode, но вы можете сделать все это за 1 шаг, вставляя строки:

insert into table2(employee,id,zone,url, authcode) 
select 
  employee, 
  id, 
  zone, 
  concat('https://',employee,'.com/',id,'?',zone),
  CONVERT(VARCHAR(10),HASHBYTES('MD5', substring(concat('https://',employee,'.com/',id,'?',zone),8,100)),2) 
from table1

или если вы хотите обновление:

update table2
set authcode = CONVERT(VARCHAR(10),HASHBYTES('MD5', substring(URL,8,100)),2) 
where authcode is null 
2 голосов
/ 23 апреля 2020

Результат, который вы видите, является предполагаемым поведением для оператора INSERT . Он всегда будет вставлять новые строки.

Если вы хотите изменить существующие строки, вам нужно использовать оператор UPDATE .

Вы можете изменить INSERT, чтобы он выглядел так, как @forpas опубликовал, чтобы сделать всю эту работу за один шаг. Другой вариант - изменить вторую INSERT на UPDATE, как показано ниже:

update table2
set authcode = CONVERT(VARCHAR(10),HASHBYTES('MD5', substring(URL,8,100)),2)
...