Déplacer des données SQL d'une table à une autre

Je me demandais s'il était possible de déplacer toutes les lignes de données d'une table à une autre, qui correspondent à une certaine requête?

Par exemple, j'ai besoin de déplacer toutes les lignes de table de Table1 à Table2 où leur nom d'utilisateur = 'X' et mot de passe = 'X', de sorte qu'ils n'apparaîtront plus dans Table1.

J'utilise SQL Server 2008 Management Studio.

49
demandé sur Vadim Kotov 2009-10-23 13:13:16

12 réponses

Devrait être possible en utilisant deux instructions dans une transaction, un insert et un delete:

INSERT INTO Table2 (<columns>)
SELECT <columns>
FROM Table1
WHERE <condition>;

DELETE FROM Table1
WHERE <condition>;

COMMIT;

C'est la forme la plus simple. Si vous devez vous soucier de l'insertion de nouveaux enregistrements correspondants dans table1 entre les deux instructions, vous pouvez ajouter un and exists <in table2>.

82
répondu Thorsten 2009-10-23 17:36:35

Ceci est un ancien poste, désolé, mais je ne suis tombé sur elle maintenant et je voulais donner ma solution à celui qui pourrait tomber sur ce un jour.

Comme certains l'ont mentionné, effectuer un INSERT puis un DELETE peut entraîner des problèmes d'intégrité, donc peut-être un moyen de le contourner, et de tout Exécuter proprement dans une seule instruction, est de profiter de la table temporaire [deleted].

DELETE FROM [source]
OUTPUT [deleted].<column_list>
INTO [destination] (<column_list>)
34
répondu that0th3rGuy 2014-02-27 07:19:42

Toutes ces réponses exécutent la même requête pour L'insertion et la suppression. Comme mentionné précédemment, cela risque de supprimer les enregistrements insérés entre les instructions et pourrait être lent si la requête est complexe (bien que les moteurs intelligents "devraient" faire le deuxième appel rapide).

La manière correcte (en supposant que L'insertion est dans une nouvelle table) est de faire la suppression contre table1 en utilisant le champ clé de table2.

Supprimer:

DELETE FROM tbl_OldTableName WHERE id in (SELECT id FROM tbl_NewTableName)

Excusez ma syntaxe, je saute entre les moteurs, mais vous obtenez l'idée.

15
répondu Ken Sands 2012-01-09 19:01:00

Oui. Insérez d'abord + sélectionnez, puis supprimez les originaux.

INSERT INTO Table2 (UserName,Password)
SELECT UserName,Password FROM Table1 WHERE UserName='X' AND Password='X'

Puis supprimer les originaux

DELETE FROM Table1 WHERE UserName='X' AND Password='X'

Vous pouvez conserver UserID ou une autre clé primaire, alors vous pouvez utiliser IDENTITY INSERT pour préserver la clé.

Voir plus sur SET IDENTITY_INSERT sur MSDN

8
répondu pirho 2012-09-30 06:03:22

Essayez ceci

INSERT INTO TABLE2 (Cols...) SELECT Cols... FROM TABLE1 WHERE Criteria

Puis

DELETE FROM TABLE1 WHERE Criteria
3
répondu Adriaan Stander 2009-10-23 09:17:50

Vous devriez pouvoir le faire avec une sous-requête dans L'instruction INSERT.

INSERT INTO table1(column1, column2) SELECT column1, column2 FROM table2 WHERE ...;

Suivi de la suppression de la table1.

N'oubliez pas de l'exécuter comme une seule transaction afin que si quelque chose ne va pas, vous puissiez annuler toute l'opération.

3
répondu workmad3 2009-10-23 09:18:23

Vous pouvez essayer ceci:

SELECT * INTO tbl_NewTableName 
FROM tbl_OldTableName
WHERE Condition1=@Condition1Value

Ensuite, exécutez une simple suppression:

DELETE FROM tbl_OldTableName
WHERE Condition1=@Condition1Value
2
répondu royse41 2009-10-23 09:18:43

Utilisez cette seule instruction sql qui est sûre pas besoin de commit / rollback avec plusieurs instructions.

INSERT Table2 (
      username,password
) SELECT username,password
      FROM    (
           DELETE Table1
           OUTPUT
                   DELETED.username,
                   DELETED.password
           WHERE username = 'X' and password = 'X'
      ) AS RowsToMove ;

Fonctionne sur SQL server apporter les modifications appropriées pour MySql

1
répondu Dheerendra Kulkarni 2017-09-13 06:13:54

Une représentation plus propre de ce que d'autres réponses ont laissé entendre:

DELETE sourceTable
OUTPUT DELETED.*
INTO destTable (Comma, separated, list, of, columns)
WHERE <conditions (if any)>
1
répondu GreySage 2018-06-19 22:25:12

Si les deux tables utilisent le même ID ou ont une clé UNIQUE commune:

1) Insérer l'enregistrement sélectionné dans le tableau 2

INSERT INTO table2 SELECT * FROM table1 WHERE (conditions)

2) Supprimer l'enregistrement sélectionné de la table1 si présente dans la table2

DELETE FROM table1 as A, table2 as B WHERE (A.conditions) AND  (A.ID = B.ID)
0
répondu user1847437 2016-08-29 07:13:01

Voici comment le faire avec une seule instruction

WITH deleted_rows AS (
DELETE FROM source_table WHERE id = 1
RETURNING *
) 
INSERT INTO destination_table 
SELECT * FROM deleted_rows;

EXEMPLE:

    postgres=# select * from test1 ;
 id |  name
----+--------
  1 | yogesh
  2 | Raunak
  3 | Varun
(3 rows)


postgres=# select * from test2;
 id | name
----+------
(0 rows)


postgres=# WITH deleted_rows AS (
postgres(# DELETE FROM test1 WHERE id = 1
postgres(# RETURNING *
postgres(# )
postgres-# INSERT INTO test2
postgres-# SELECT * FROM deleted_rows;
INSERT 0 1


postgres=# select * from test2;
 id |  name
----+--------
  1 | yogesh
(1 row)

postgres=# select * from test1;
 id |  name
----+--------
  2 | Raunak
  3 | Varun
0
répondu gpdude_ 2016-11-05 06:30:28

Vous pouvez utiliser "partitionnement logique" pour basculer les données entre les tables:

En mettant à jour la colonne de Partition, les données seront automatiquement déplacées vers l'autre table:

Voici l'échantillon:

CREATE TABLE TBL_Part1
(id  INT NOT NULL,
 val VARCHAR(10) NULL,
 PartitionColumn  VARCHAR(10) CONSTRAINT CK_Part1 CHECK(PartitionColumn = 'TBL_Part1'),
 CONSTRAINT TBL_Part1_PK PRIMARY KEY(PartitionColumn, id)
);

CREATE TABLE TBL_Part2
(id  INT NOT NULL,
 val VARCHAR(10) NULL,
 PartitionColumn  VARCHAR(10) CONSTRAINT CK_Part2 CHECK(PartitionColumn = 'TBL_Part2'),
 CONSTRAINT TBL_Part2_PK  PRIMARY KEY(PartitionColumn, id)
);

GO

CREATE VIEW TBL(id, val, PartitionColumn)
WITH SCHEMABINDING
AS
     SELECT id, val, PartitionColumn FROM dbo.TBL_Part1
     UNION ALL  
     SELECT id, val, PartitionColumn FROM dbo.TBL_Part2;

GO

--Insert sample to TBL ( will be inserted to Part1 )
INSERT INTO TBL
VALUES(1, 'rec1', 'TBL_Part1');

INSERT INTO TBL
VALUES(2, 'rec2', 'TBL_Part1');

GO

--Query sub table to verify
SELECT * FROM TBL_Part1

GO
--move the data to table TBL_Part2 by Logical Partition switching technique
UPDATE TBL
  SET
      PartitionColumn = 'TBL_Part2';

GO

--Query sub table to verify
SELECT * FROM TBL_Part2
0
répondu abdkok 2016-11-28 20:14:22