2012-05-17 33 views
38

que tiene esta declaración:INSERT INTO con subconsulta MySQL

INSERT INTO qa_costpriceslog (item_code, invoice_code, item_costprice) 
    VALUES (1, 2, (SELECT item_costprice FROM qa_items WHERE item_code = 1)); 

Estoy tratando de insertar un valor copiar los mismos datos de item_costprice, pero me muestran el error:

Error Code: 1136. Column count doesn't match value count at row 1 

Cómo me puede resolver esto?

Respuesta

61

Usa literales numéricos con alias dentro de una declaración SELECT. No es necesario () alrededor del componente SELECT.

INSERT INTO qa_costpriceslog (item_code, invoice_code, item_costprice) 
    SELECT 
    /* Literal number values with column aliases */ 
    1 AS item_code, 
    2 AS invoice_code, 
    item_costprice 
    FROM qa_items 
    WHERE item_code = 1; 

Tenga en cuenta que en el contexto de un INSERT INTO...SELECT, los alias no son realmente necesarias y se puede simplemente SELECT 1, 2, item_costprice, pero en una normal de SELECT necesitará el alias para acceder a las columnas devueltas.

+0

wow, gracias de hecho es lo que necesitaba + REP :) –

3

Su instrucción de inserción contiene demasiadas columnas en el lado izquierdo o no hay suficientes columnas en el lado derecho. La parte antes de VALUES tiene 7 columnas enumeradas, pero la segunda parte después de VALUES solo tiene 3 columnas devueltas: 1, 2, luego la subconsulta solo devuelve 1 columna.

EDIT: Bueno, lo hizo antes de que alguien modificó la consulta ....

+2

Esto es en realidad una buena explicación del problema. – mizuti

4

simplemente puede, por ejemplo,

INSERT INTO modulesToSections (fk_moduleId, fk_sectionId, `order`) VALUES 
    ((SELECT id FROM modules WHERE title="Top bar"),0,-100); 
+0

'Error en la consulta (1242): la subconsulta devuelve más de 1 fila' -> la sintaxis es correcta, pero eso es solo para una sola fila. – stamster

Cuestiones relacionadas