web-dev-qa-db-fra.com

Copier les lignes de la même table et mettre à jour la colonne ID

J'ai le tableau suivant

alt text

J'ai inséré le produit B et cela me donne un identifiant de 15

Ensuite, j'ai la table de définition qui est comme suit.

alt text

Je veux sélectionner les lignes ProductDefinition où ProdID = 14 et répliquer les mêmes et l'insérer pour ProdID = 15 comme suit

alt text

Comment y parvenir en utilisant du code SQL?

26
kalls
INSERT INTO ProuctDefinition (ProdID, Definition, Desc)
SELECT
  xxx, Definition, Desc
FROM
  ProductDefinition
WHERE
  ProdID = yyy

xxx est votre nouveau ProdID et le yyy est votre ancien. Cela suppose également que DefID est automatiquement renseigné sur INSERT.

51
Blrfl

Cela fonctionnera avec n'importe quelle colonne de votre choix. Pas seulement clé primaire/ID.

INSERT INTO TableName (Column1, CustomID, Column3, Column4, Column5)
SELECT Column1, 'NewValue', Column3, Column4, Column5 FROM TableName
WHERE CustomID='OrigValue'
9
Donald Powell

Peut utiliser MERGE sur SQL Server 2008, présente l'avantage d'utiliser OUTPUT pour renvoyer les valeurs DefID, en supposant qu'elles sont générées automatiquement, par exemple 

MERGE INTO ProductDefinition
USING (
       SELECT 16, P1.Definition, P1.Description
         FROM ProductDefinition AS P1
        WHERE P1.ProdID = 15
      ) AS source (ProdID, Definition, Description)
ON 0 = 1
WHEN NOT MATCHED THEN
   INSERT (ProdID, Definition, Description)
   VALUES (ProdID, Definition, Description)
   OUTPUT inserted.DefID, inserted.ProdID, 
             inserted.Definition, inserted.Description;
3
onedaywhen

si vous voulez sélectionner tous les éléments (dans l'état la table ne contient aucune clé primaire)

INSERT INTO [tabelName]
SELECT  * FROM    [tabelName]
WHERE  (YourCondition)

si la table contient une clé primaire, sélectionnez uniquement les colonnes qui ne sont pas une clé primaire.

INSERT INTO [tabelName]
SELECT  col_1,col_2,col_n FROM    [tabelName]
WHERE  (YourCondition)
2
Ahmed Elzeiny

Si vous souhaitez répliquer des données dans la même table, utilisez cette logique:

tout d'abord, insérez la déclaration à l'endroit où vous souhaitez insérer ...

insert into [table](column1,column2)

deuxièmement, sélectionnez la commande à partir de laquelle vous souhaitez extraire des données ....

select (column1/'your value',column2/'your value') from [table]

maintenant définir le filtre quelles lignes vous souhaitez dupliquer 

where (your condition)

en tant que veulent reproduire les mêmes données pour différents clients, j'ai utilisé cette requête.

1
Divya

Si votre identifiant n'est pas auto-incrémenté ou séquence déclarée et si vous ne voulez pas créer de table temporaire:

vous pouvez utiliser:

INSERT INTO Tabel1 SELECT ((ROW_NUMBER( ) OVER ( ORDER BY ID  )) + (SELECT  MAX(id) FROM Table1)) ,column2,coulmn3,'NewValue' FROM Tabel1 Where somecolumn='your value`
0
Prabin Poudel