0

我有三个 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 行。我的查询如下:

插入 tbl_info (id,msg) 值((SELECT id FROM tbl_id),(SELECT msg FROM tbl_msg))

4

1 回答 1

1

您需要编写一个 SELECT 语句,该语句返回您希望插入的行。

2 个内部选择返回了 tbl_id 中的所有 id 和 tbl_msg 中的所有 msg,这没有多大意义。

先写select,eg:

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;
于 2011-07-06T10:49:53.247 回答