Sqlserver
 sql >> база данни >  >> RDS >> Sqlserver

Как да вмъкнете данните от една колона в друга таблица

Причината да получите тази грешка е, че admin_id не е NULLABLE което означава, че трябва имат admin_id за всеки ред. Когато изпълнявате INSERT трябва изрично да вмъкнете admin_id тъй като не е IDENTITY колона собственост.

Очакваните ви резултати показват, че искате да направите UPDATE , а не INSERT . UPDATE ще UPDATE admin_id в момента във вашия table_admin таблица вместо вмъкване на нови редове. Единственото нещо, което не е ясно, е как table_admin се отнася до table_information . Как на john се присвоява admin_id = 1 ?

След като дефинирате това, ето UPDATE

update t 
set t.admin_name = i.admin_name
from table_admin t
inner join table_information i on i.someColumn = t.someColumn

Ако не ви интересува кое admin_name получава какъв admin_id , тогава можете да създадете сурогатен ключ и да актуализирате вашата таблица. Ще изглежда така:

select distinct 
    admin_name
    ,admin_id = row_number() over (order by (select null))
into #tempInformation
from table_information

--this is going to show the admin_id that will be updated in the table_admin table
select * from #tempInformation

update t 
set t.admin_name = i.admin_name
from table_admin t
inner join #tempInformation i on i.admin_id = t.admin_id

РЕДАКТИРАНЕ

Ако нямате никакви admin_name понастоящем попълнен в table_admin тогава ви предлагам просто да съкратите тази таблица и да вмъкнете вашето различно admin_name . Отново бих направил и admin_id свойство за идентичност

truncate table table_admin

insert into table_admin (admin_id, admin_name)
   select distinct 
        admin_id = row_number() over (order by (select null))
        ,admin_name

Трябва да подчертая, че в повечето схеми admin_id би означавало нещо. Това ще бъде PRIMARY KEY за тази таблица и да се използва за свързване на тази таблица с други в базата данни. Следователно, не знаейки кой admin_id отива към това admin_name означава, че имате истинска бъркотия в ръцете си и присвояването им на случаен принцип трябва прекъсване на процесите надолу по веригата... но това може да не е така, тъй като не сте го поддържали от самото начало.

Бих попитал защо? Това би означавало, че имате съпоставяне на admin_name до admin_id вече... но не си показал това.




  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Случаен претеглен избор в T-SQL

  2. ExecuteNonQuery връща -1 при използване на sql COUNT въпреки низа на заявката

  3. Свързване с локална база данни на SQL Server с помощта на C#

  4. Отваряне на .bak файл на SQL Server (без възстановяване!)

  5. Как да използвам JOIN вместо UNION за преброяване на съседите на A ИЛИ B?