我有三个table.2数据来自2个表并将其插入另一个表中。 设:tbl_id保持字段id,tbl_msg保持字段msg。
tbl_id tbl_msg
id msg
------ --------
1234 test_msg
5678
9876
现在我想要的输出应该在tbl_info
中id msg
--- -------
1234 test_msg
5678 test_msg
9876 test_msg
我编写了一个查询,但它显示的错误是:子查询返回超过1行。 我的查询如下:
INSERT INTO tbl_info(id,msg)VALUES((SELECT id FROM tbl_id),(SELECT msg FROM tbl_msg))
答案 0 :(得分:1)
您需要编写一个SELECT语句,该语句完全按照您希望的方式返回行。
2个内部选择你从tbl_id返回所有id和来自tbl_msg的所有msg,这没有多大意义。
首先编写select,例如:
SELECT tbl_id.id, tbl_msg.msg
FROM tbl_id
JOIN tbl_msg ON tbl_id.fk = tbl_msg.fk
WHERE (...)
然后将其用于INSERT:
INSERT INTO tbl_info (id, msg)
SELECT tbl_id.id, tbl_msg.msg
FROM tbl_id
JOIN tbl_msg ON tbl_id.fk = tbl_msg.fk
WHERE (...)
更新根据OP的评论:
INSERT INTO tbl_info (id, msg)
SELECT tbl_id.id, single_msg.msg
FROM tbl_id
JOIN (SELECT msg
FROM tbl_msg
WHERE CURDATE()=DATE_FORMAT(date_time,'%Y-%m-%d')
ORDER BY date_time DESC LIMIT 1) as single_msg ON 1=1;
这不会非常有效,因为将对tbl_id中的每个记录执行内部选择。更有效的解决方案可能是:
SELECT msg INTO @msg
FROM tbl_msg
WHERE CURDATE()=DATE_FORMAT(date_time,'%Y-%m-%d')
ORDER BY date_time DESC LIMIT 1;
INSERT INTO tbl_info (id, msg)
SELECT tbl_id.id, @msg
FROM tbl_id;