2014-11-05 1 views
3

Если у нас есть два или более таблиц с одинаковыми столбцамиОбъединение 2 таблицы в SQL и сохранить в 1 новую таблицу

Таблица 1

Structure, Name, Active 
1,A,1 

Таблица 2

Structure, Name, Active 
2,B,0 

Мы хотели для объединения этих двух таблиц и сохранения их в новый

Новая таблица

Structure, Name, Active 
1,A,1 
2,B,0 

Вот код

CREATE TABLE Amide_actives_decoys 
(
    Structure NVARCHAR(255), 
    Name NVARCHAR(255), 
    Active INT 
) 
GO 

INSERT Amide_actives_decoys 
FROM (
    SELECT * FROM Amide_decoys 
    UNION 
    SELECT * FROM Amide_actives 
) 

следующее сообщение об ошибке будет отображаться

Msg 156, Level 15, State 1, Line 10
Неправильный синтаксис около ключевого слова «FROM ».

То же самое, если мы используем

SELECT * INTO Amide_actives_decoys 
FROM (
    SELECT * FROM Amide_decoys 
    UNION 
    SELECT * FROM Amide_actives 
) 

После этого ответа

Joining a table onto itself in SQL and saving the result

Сообщение об ошибке будет

Msg 102, Level 15, State 1 , Строка 5
Неверный синтаксис рядом с ';'.

Может ли любой гуру предложить свои комментарии? Благодаря!

+0

Plz см это: HTTP: // blog.sqlauthority.com/2012/08/29/sql-server-three-methods-to-insert-multiple-rows-i nto-single-table-sql-in-sixty-seconds-024-video/ – Backtrack

ответ

6

Этот синтаксис работает в различных базах данных:

INSERT INTO Amide_actives_decoys(Structure, Name, Active) 
    SELECT * FROM Amide_decoys 
    UNION 
    SELECT * FROM Amide_actives; 

В таком виде вставки, выход подзапроса становится множество входных значений для вставки.

Обратите внимание, что типы данных для выражений в операторе SELECT должны соответствовать типам данных в целевой таблице инструкции INSERT .

Все строки, возвращаемые подзапросом, вставляются в таблицу Amide_actives_decoys.

Если какая-либо одна строка не удаляет INSERT из-за нарушения ограничения или конфликта типа данных, весь INSERT терпит неудачу и строки не вставлены.

Любой действительный подзапрос может использоваться в инструкции INSERT.

+0

+1 хороший ответ. Plz добавить объяснение, если возможно, что будет хорошо :) – Backtrack

3

Я думаю, вам нужно UNION ALL, иначе вы не сможете захватить все данные; зависит от того, какие данные находятся в таблице (дубликаты и т. д.).

INSERT INTO Amide_actives_decoys(Structure, Name, Active) 
    SELECT * FROM Amide_decoys 
    UNION ALL 
    SELECT * FROM Amide_actives; 
+0

Спасибо Simon1979! Здесь нам нужен UNION ALL, иначе некоторые данные отсутствуют! – Chubaka

1

Общий синтаксис

INSERT INTO table2 
SELECT * FROM table1; 

вы можете SELECT INTO Заявление в этом случае

with cte as (select 1 col1 ,2 col2 
union all 
select 2,3) 
select * into #tabletest from cte 

select *From #tabletest 
1

В обоих ваших ответов, вопрос в том, что вы не дали псевдоним, для таблица в результате. Я думаю, вы пропустили 'INTO' в заявлении INSERT.

Запрос 1:

CREATE TABLE Amide_actives_decoys 
(
    Structure NVARCHAR(255), 
    Name NVARCHAR(255), 
    Active INT 
) 
GO 

INSERT INTO Amide_actives_decoys 
SELECT * 
FROM (
     SELECT * FROM Amide_decoys 
     UNION 
     SELECT * FROM Amide_actives 
     ) LU --LU is added. 

Для запроса 1, ниже также правильно

INSERT INTO Amide_actives_decoys 
SELECT * FROM Amide_decoys 
UNION 
SELECT * FROM Amide_actives 

Запрос 2:

SELECT * 
INTO Amide_actives_decoys 
FROM (
     SELECT * FROM Amide_decoys 
     UNION 
     SELECT * FROM Amide_actives 
     ) LU -- LU added 
+1

Хороший и подробный ответ тоже! Однако здесь нам нужен UNION ALL, иначе некоторые данные отсутствуют! – Chubaka

+0

Да, UNION ALL также следует иметь в виду. –

0
create table Amide_actives_decoys 
as 
select Structure, Name, Active from 
(
SELECT * FROM Amide_decoys 
UNION 
SELECT * FROM Amide_actives 
) 
; 
+0

Лучше всего объяснить свои ответы, а не только почтовый код, поскольку ОП может не полностью следовать только коду. – SuperBiasedMan

Смежные вопросы