2012-05-17 296 views
38

我有这样的说法:INSERT INTO与子查询的MySQL

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

我试图插入值复制item_costprice的数据相同,但给我的错误:

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

我如何可以解决这个?

回答

61

使用数字文字与SELECT语句中的别名。在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; 

注意,在INSERT INTO...SELECT的背景下,别名不是确有必要,你可以直接SELECT 1, 2, item_costprice,但在正常SELECT你需要的别名来访问返回的列。

+0

哇,真是太感谢您是我需要的+ REP :) –

3

INSERT语句中包含右手侧的左侧列太多或没有足够的列。 VALUES之前的部分列出了7列,但VALUES之后的第二部分仅返回了3列:1,2,则子查询只返回1列。

编辑:嗯,这的确有人修改查询之前....

+2

这实际上是问题的一个很好的解释。 – mizuti

4

你可以简单地如

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

查询错误(1242):子查询返回多于1行' - >语法正确,但这仅适用于单行。 – stamster