web-dev-qa-db-fra.com

Fusionner 2 tables en SQL et sauvegarder dans 1 nouvelle table

Si nous avons deux tables ou plus avec les mêmes colonnes

Tableau 1

Structure, Name, Active
1,A,1

Tableau 2

Structure, Name, Active
2,B,0

Nous aimerions combiner ces deux tables et les sauvegarder dans une nouvelle.

Nouvelle table 

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

Voici le code

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 
)

Le message d'erreur suivant apparaîtra

Msg 156, Niveau 15, Etat 1, Ligne 10
Syntaxe incorrecte près du mot clé 'FROM'.

La même chose si on utilise

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

Suite à cette réponse

Joindre une table sur elle-même en SQL et sauvegarder le résultat

Le message d'erreur sera

Msg 102, Niveau 15, Etat 1, Ligne 5
Syntaxe incorrecte près de ';'. 

Un gourou pourrait-il bien vouloir faire quelques commentaires? Merci!

5
Chubaka

Cette syntaxe fonctionne dans différentes bases de données:

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

Dans cette forme d'INSERT, la sortie de la sous-requête devient l'ensemble de valeurs d'entrée pour l'INSERT. 

Notez que les types de données pour les expressions dans l'instruction SELECT La sous-requête doit correspondre aux types de données de la table cible de INSERT déclaration.

Toutes les lignes renvoyées par la sous-requête sont insérées dans le fichier Table Amide_actives_decoys.

Si une ligne échoue avec INSERT en raison d'une violation de contrainte ou de En cas de conflit de type de données, la commande INSERT échoue et aucune ligne n'est insérée.

Toute sous-requête valide peut être utilisée dans l'instruction INSERT.

6
Multisync

Je pense que vous devez UNION ALL sinon vous ne pouvez pas capturer toutes les données; dépend des données présentes dans la table (doublons, etc.).

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

La syntaxe générale est 

INSERT INTO table2
SELECT * FROM table1;

vous pouvez SELECT INTO Instruction dans ce cas

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

select *From #tabletest
1
King_Fisher

Dans vos deux réponses, le problème est que vous n'avez pas donné d'alias à la table en conséquence. Je pense que vous avez également manqué un 'INTO' dans la déclaration INSERT.

Requête 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.

Pour la requête 1, le ci-dessous est également correct

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

Requête 2:

SELECT  * 
INTO    Amide_actives_decoys
FROM    (
        SELECT * FROM Amide_decoys 
        UNION
        SELECT * FROM Amide_actives 
        ) LU -- LU added
1
Jithin Shaji
create table Amide_actives_decoys
as
select Structure, Name, Active from 
(
SELECT * FROM Amide_decoys 
UNION
SELECT * FROM Amide_actives 
)
;
0
user6704385