我在INSERT语句中遇到困难,我提供了前四列的值。第五个(最后一个)列应该连接另一个表的两列。那部分工作正常,但只有一行。这两个表都有12行(因此是12个字面值),但是我如何使连接的子查询返回所有行为我正在尝试的一列插入(从而与其他列中的值对应)?
已经尝试了很多方法,但这就是现在的样子......
INSERT INTO properties (property_id, condo_type, pets, internet, owner_name)
SELECT
'301S', '207S', '1100T', '1201S', '317T', '110S', '1010S', '409T', '505T', '1005S', '656S', '942S' AS property_id,
'SandsOF3BR', 'SandsOF3BR', 'SandsOF2BR', 'Tides3BR', 'SandsOF2BR', 'Tides2BR', 'SandsOF2BR', 'SandsOF2BR', 'Tides2BR', 'Tides3BR', 'SandsOF2BR', 'SandsOF3BR' AS condo_type,
1,1,0,0,0,0,0,1,1,1,1,0 AS pets,
1,1,0,1,1,1,0,1,0,1,0,0 AS internet,
CONCAT(owner_first_name, ' ', owner_last_name) AS owner_name
FROM owners LEFT JOIN properties
ON owners.property_id = properties.property_id
WHERE owners.property_id = properties.property_id;
所以基本上,属性表和所有者表都在各自的“property_id”列中有数据,反映哪个属性属于什么所有者。我的意思是,我是否必须创建一个循环遍历第二个表的过程,还是有更传统的方法?或者我是否会填写这个专栏?请帮忙,谢谢...... ANYBODY ??
答案 0 :(得分:2)
INSERT INTO properties
(property_id, /*here*/
condo_type, /*you*/
pets, /*name*/
internet, /*5*/
owner_name) /*columns*/
SELECT '301S', /*here you name way more than the 5 columns*/
'207S', /*from your insert statement.*/
'1100T',
'1201S', /*So, where to put them? MySQL doesn't know*/
'317T', /*That's why you get an error.*/
'110S',
'1010S',
'409T',
'505T',
'1005S',
'656S',
'942S' AS property_id,
'SandsOF3BR',
'SandsOF3BR',
'SandsOF2BR',
'Tides3BR',
'SandsOF2BR',
'Tides2BR',
'SandsOF2BR',
'SandsOF2BR',
'Tides2BR',
'Tides3BR',
'SandsOF2BR',
'SandsOF3BR' AS condo_type,
1,
1,
0,
0,
0,
0,
0,
1,
1,
1,
1,
0 AS pets,
1,
1,
0,
1,
1,
1,
0,
1,
0,
1,
0,
0 AS internet,
Concat(owner_first_name, ' ', owner_last_name) AS owner_name
FROM owners
LEFT JOIN properties
ON owners.property_id = properties.property_id
WHERE owners.property_id = properties.property_id;
这两列
Concat(owner_first_name, ' ', owner_last_name) AS owner_name
来自业主表?如果是,那你为什么要加入properties
表呢?没有必要。
像这样写:
INSERT INTO properties
(property_id,
condo_type,
pets,
internet,
owner_name)
SELECT 'value1',
'value2',
'value3',
'value4',
Concat(owner_first_name, ' ', owner_last_name)
FROM owners
;
这将从所有者(当然只有2列)中插入所有行到属性中。前4列对于每一行都是相同的,因为它们只是字符串。
如果要将静态字符串插入表中,可以编写多个语句,也可以在一个语句中指定多行,如下所示:
INSERT INTO foo (col1, col2) VALUES
(1, 2), /*first row*/
(3, 4); /*second row*/
修改强>
要结合这两种方法,你必须写下这样的东西:
INSERT INTO properties
(property_id,
condo_type,
pets,
internet,
owner_name)
SELECT
CASE owners.property_id WHEN 1 THEN 'value1'
WHEN 2 THEN 'value2'
END AS column1,
CASE WHEN owner_first_name = 'fancy' AND owner_last_name = 'pants' THEN 'value3'
ELSE 'value4' END AS column2,
Concat(owner_first_name, ' ', owner_last_name) AS owner_name
FROM owners
LEFT JOIN properties
ON owners.property_id = properties.property_id
WHERE owners.property_id = properties.property_id;
不太实际;)