#sql #sql-server #tsql #ssms
Вопрос:
У меня есть две таблицы, которые мне нужно объединить без создания нового представления/таблицы. В принципе, мне нужно добавить только один столбец в существующую таблицу, взятую из другой таблицы.
Мне нужно получить таблицу, которая выглядела бы точно так 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)