2014-02-10 19 views
0
INSERT INTO `database_name`.`table_3` (
`value_id` , 
`entity_type_id` , 
`attribute_id` , 
`store_id` , 
`entity_id` , 
`value` 
) 
VALUES (
NULL , '4', '85', '0', 
SELECT entity_id FROM table_3 WHERE table_3.value = 'someTextThatIKnow', 
SELECT value FROM table_1 WHERE entity_id = SELECT entity_id FROM table_3 WHERE table_3.value = 'someTextThatIKnow' 
); 

这就是我的代码。所以,在table_3我有一个插入的行,其值为entity_idvalue列。现在,在同一个表我想在同一列的以下插入:使用SELECT语句作为插入的值

  1. entity_id - >相同的值从已经插入行中value
  2. - >的某行中table_1值(其还具有* entity_id *和列),其中在entity_id下的值与table_3中的行相同。

我希望你能理解我的想法是什么。

现在,我得到错误#1064(语法错误)。我似乎可以找到任何语法错误。我也尝试围绕' '的表名称。我怎样才能构造这个查询?

+0

如果你不得不使用'()',但下面给出的答案要好得多。 – malta

+0

为了确保我明白了,您正试图向table_3添加更多全新的行,而不是更新现有行以将来自table_1的缺失数据放入列中,对不对? –

+2

除了下面的答案之外,请注意,没有要求用引号括起来的整数。这样做会*降低性能! – Strawberry

回答

2

忽略位的值,并把所有的数据在你的选择:

INSERT INTO `database_name`.`table_3` (
`value_id` , 
`entity_type_id` , 
`attribute_id` , 
`store_id` , 
`entity_id` , 
`value` 
) 
SELECT NULL, 4, 85, 0, table_3.entity_id, table_1.value 
FROM table_3 
INNER JOIN table_1 ON table_3.entity_id = table_1.entity_id 
WHERE table_3.value = 'someTextThatIKnow'; 

the documentation。请注意,这可能会一次插入多行。


每从评论跟进:

对于TABLE_3增加3项,有三种不同的entity_type_id值,但是只有一个匹配现有的行,你可以调用insert语句为三倍以上,有三个不同的硬编码值。

或者,你可以做一个单一的一批这样的:

INSERT INTO `database_name`.`table_3` (
`value_id` , 
`entity_type_id` , 
`attribute_id` , 
`store_id` , 
`entity_id` , 
`value` 
) 
SELECT NULL, 4, entid_values.entity_type_id, 0, table_3.entity_id, table_1.value 
FROM table_3 
INNER JOIN table_1 ON table_3.entity_id = table_1.entity_id 
CROSS JOIN 
(
    SELECT 85 AS entity_type_id 
    UNION 
    SELECT 86 AS entity_type_id 
    UNION 
    SELECT 87 AS entity_type_id 
) AS entid_values 
WHERE table_3.value = 'someTextThatIKnow'; 

它也可以通过创建,填充做到这一点,和跨加入对临时表,而不是使用嵌套查询。如果您使用许多不同的硬编码值,或想要为多个不同的列应用多个静态值,临时表方法将使插入语句更易于阅读。

一个更容易阅读和更好的执行方式,因为它们是整数值,将保持a tally or numbers table在您的数据库中并加入。

+0

为什么它有机会插入多个单行,而我从中获取输入值的行仅存在一次? – Syspect

+2

如果匹配select语句的数据只存在一次,那么它只会插入一行。但是它有可能会插入多个,因为你使用了select语句,它选择了一组行。例如,如果table_3中有三行value ='someTextThatIKnow',并且table_1中的行与匹配的entity_id匹配,那么此查询将插入三行。 –

+0

我明白了。但是,是的,我选择的值和entity_id之间的匹配只发生一次,所以它们都很好。 – Syspect

1

把所有的值插入到select语句:

INSERT INTO `database_name`.`table_3` (
`value_id` , 
`entity_type_id` , 
`attribute_id` , 
`store_id` , 
`entity_id` , 
`value`) 

SELECT NULL , '4', '85', '0', t3.entity_id, t1.value 
FROM table_3 t3 
INNER JOIN table_1 t1 ON t3.entity_id = t1.entity_id 
WHERE t3.value = 'someTextThatIKnow'; 
+1

但您不会在任何地方使用'table_1',这就是我必须将输入值插入到'table_3'中的地方 – Syspect

+0

啊,错过了table_1引用,已更新 –