Pregunta INSERT INTO SELECT vs VALUES


Aunque no hay ninguna razón (aparte tal vez de la estética) para usar INSERT INTO SELECT al insertar una soltero fila en una tabla, ¿hay alguna diferencia entre usar esto y INSERT INTO VALUES?


11
2017-07-11 11:25


origen


Respuestas:


Utilizando el INSERT INTO ... SELECT El enfoque le permite elegir sus valores de otra tabla, de acuerdo con algunos criterios.

INSERT INTO dbo.TargetTable(Col1, Col2, ...., ColN)
   SELECT Col1, Col2, ..., ColN
   FROM dbo.SourceTable
   WHERE (some condition)

Eso podría ser un poco más fácil y más legible de escribir, en lugar de tener que recuperar 20 valores de su tabla de origen, esconderlos en variables temporales, solo para que pueda llamar a su INSERT INTO dbo.Destination(....) VALUES(......) declaración...

DECLARE @Value1 INT
DECLARE @Value2 DATETIME
....
DECLARE @ValueN INT

SELECT 
      @Value1 = Col1,
      @Value2 = Col2,
      ....
      @ValueN = ColN
FROM 
    dbo.SourceTable
WHERE
     (some condition) 

INSERT INTO dbo.TargetTable(Col1, Col2, ...., ColN)
VALUES(@Value1, @Value2, ....., @ValueN)

Pero al final, es solo una INSERT  declaración que inserta datos, es realmente solo una cuestión de preferencia personal y qué enfoque es más fácil / más conveniente de usar ....


10
2017-07-11 11:29



SELECCIONAR le permite probar primero la existencia

INSERT Target (...)
SELECT keyvalue1, value2
WHERE NOT EXISTS (SELECT * FROM Target WHERE keycol = keyvalue1)

O 2 conjuntos de valores

INSERT Target (...)
SELECT keyvalue1, value2
UNION ALL
SELECT keyvalue1a, value2a

De lo contrario, no hay diferencia para una lista de valores y una fila

Si sus valores provienen de otra tabla, solo INSERTAR ... SÉRTELO ... por supuesto

O mix'n'match:

INSERT Target (...)
SELECT col1, col2, @parameter1, @parameter2, col14
FROM Source

7
2017-07-11 11:38



No estoy seguro de las diferencias que estás buscando, pero uso esto todo el tiempo para hacer la validación. Si estoy insertando una fila en una tabla con relaciones FK, usaré una selección en la tabla a la que se hace referencia para asegurar que el FK esté allí. Ejemplo:

En lugar de

INSERT refTable (Tab1Key,  Tab2Key, ...)
VALUES         (@Tab1Key, @Tab2Key, ...)

yo suelo

INSERT refTable (Tab1Key,  Tab2Key, ...)
SELECT          Tab1.Key, Tab2.Key, ...
  FROM Table1 Tab1, Table2 Tab2
 WHERE Tab1.Key = @Tab1Key
   AND Tab2.Key = @Tab2Key

El resultado es el mismo excepto que no se insertan filas si las claves no existen.


5
2017-07-11 11:29