Как вставить столбец из другой таблицы в T-SQL?

#sql #sql-server #tsql #ssms

Вопрос:

У меня есть две таблицы, которые мне нужно объединить без создания нового представления/таблицы. В принципе, мне нужно добавить только один столбец в существующую таблицу, взятую из другой таблицы.

table1 выглядит так:
введите описание изображения здесь

table2 выглядит так:
введите описание изображения здесь

Мне нужно получить таблицу, которая выглядела бы точно так table2 же, но с дополнительным столбцом: programs_total . Если id в первом столбце такого нет, я хочу, чтобы во втором столбце было NULL . В этом примере я хочу, чтобы необработанные данные с id=72_200 были NULL в programs_total столбце.

Я попробовал следующий сценарий:

 -- adding a new column 
ALTER TABLE table2
ADD programs_total BIGINT NULL;

-- inserting new data
INSERT INTO table2 (programs_total)
SELECT programs_total
FROM table1
 

но это приводит к следующей ошибке:

 Msg 515, Level 16, State 2, Line 4
Cannot insert the value NULL into column 'id', table 'stb.dbo.table2'; column does not allow nulls. INSERT fails.
The statement has been terminated.
 

Я полагаю, что он пытается вставить три новые строки вместо объединения столбца с существующими. Как мне сказать ему, чтобы он присоединил столбец к существующим строкам?

Или, может быть, я делаю что-то еще не так?

Комментарии:

1. Похоже , ты хочешь ан UPDATE с а JOIN , а не ан INSERT . Или могут ли быть строки для значения id в «таблице 1», которые не отображаются в table2 ?

Ответ №1:

Похоже, это то, чего ты действительно хочешь. UPDATE :

 UPDATE t2
SET t2.total_programs = t1.total_programs
FROM dbo.table2 t2
     JOIN dbo.table1 t1 ON t2.id = t1.id;
 

Однако, если у вас могут быть значения id in table1 , которые не отображаются в table2 , и вы также хотите вставить эти значения table2 , вам понадобится MERGE :

 MERGE dbo.Table2 AS T2
USING dbo.TAble1 AS T1 ON T2.id = T1.id
WHEN MATCHED THEN
    UPDATE 
    SET total_programs = t1.total_programs
WHEN NOT MATCHED THEN
    INSERT (id,total_programs)
    VALUES(T1.id,T1.total_programs);
 

Или вы могли бы написать это как Апсерт следующим образом:

 UPDATE t2
SET t2.total_programs = t1.total_programs
FROM dbo.table2 t2
     JOIN dbo.table1 t1 ON t2.id = t1.id;

INSERT INTO dbo.Table2(id,total_programs)
SELECT t1.id,
       t1.total_programs
FROM dbo.Table1 t1
WHERE NOT EXISTS (SELECT 1
                  FROM dbo.Table2 t2
                  WHERE t2.id = t1.id);
 

Комментарии:

1. Спасибо, это помогло!

2. @Larnu Второе решение, в котором вы сворачиваете свой собственный Апсерт, кажется немного более безопасным; лично я отказался от использования MERGE после прочтения следующего от Аарона Бетранда: mssqltips.com/sqlservertip/3074/…

Ответ №2:

Описание: вам нужен ан UPDATE , а не ан INSERT . Первый добавит новую строку, следовательно, ваша ошибка для столбцов, не допускающих значения null

Попробуйте выполнить следующее для проверки, и если это выглядит хорошо, запустите UPDATE инструкцию:

 SELECT 
     t2.*
    ,table1.programs_total   /* new column*/
FROM table2 t2
LEFT OUTER JOIN table1 on t2.ID = table1.id  ;
 

Обновить:

 UPDATE t2
SET total_programs = table1.programs_total
FROM table2 t2
LEFT OUTER JOIN table1 on t2.ID = table1.id  ;
 

Ответ №3:

Во-первых, вы можете получить данные с помощью:

 SELECT 
    table2.id,
    table2.total_duration,
    table1.programs_total
FROM
    table2
    LEFT JOIN table1
    ON table2.id = table1.id
 

И если вам нужны эти данные в виде новой таблицы, вы можете просто добавить В нее вот так:

 SELECT 
    table2.id,
    table2.total_duration,
    table1.programs_total
INTO
    table3
FROM
    table2
    LEFT JOIN table1
    ON table2.id = table1.id
 

С именем новой таблицы «table3».

Комментарии:

1. оператору не нужна новая таблица, просто добавленное поле в таблицу 2

2. Цитирую: «Мне нужно получить таблицу, которая выглядела бы точно так же, как таблица 2». Я думаю, что мое решение применимо здесь.

3. Прочитайте первую строку — без создания нового представления/таблицы . Ваше решение найдет правильные совпадения, хотя есть новый объект, который, похоже, не является чем-то, что ОП хочет иметь

4. Ах, я пропустил это, достаточно справедливо — я оставлю свой ответ на случай, если это будет полезно, но я могу удалить его по усмотрению ОП.

5. @HarryClark Все еще спасибо за ваш ответ! Это действительно решило бы мою проблему, но ответ Ларну-это именно то, что я искал. Давайте оставим ваш ответ здесь на случай, если он будет полезен кому-то еще.

Ответ №4:

Вам нужно обновить эту колонку:

 UPDATE table2 
SET total_programs = B.total_programs
FROM table1 A
JOIN table2 B
ON A.ID = B.ID
 

Ответ №5:

Спасибо, что задали вопрос с такими подробностями. Вы также можете использовать подзапрос для обновления таблицы2.

 update table2
set programs_total=(select programs_total from table1 where table1.id=table2.id)