SQL 查询表中的更新行并将其插入为新行
Posted
技术标签:
【中文标题】SQL 查询表中的更新行并将其插入为新行【英文标题】:SQL query for update rows in a table and insert those as new rows 【发布时间】:2020-07-26 05:26:55 【问题描述】:这是想要实现的:-
从表 t 中获取一些行 (x)。 在所有这些 x 行中更改一个 col 值 (f)。 然后将这些 x 作为新行插入到同一个表 t 中。此过程不适用于此错误:-
您不能在 FROM 子句中指定目标表 't' 进行更新
这是我的程序
DELIMITER //
DROP procedure IF EXISTS copy_values //
CREATE PROCEDURE copy_values(
IN source_id char(36),
IN dest_id char(36))
BEGIN
INSERT INTO t (a, b, c, d, e, f)
VALUES (
(SELECT a FROM t WHERE t_cid=source_id),
(SELECT b FROM t WHERE t_cid=source_id),
(SELECT c FROM t WHERE t_cid=source_id),
(SELECT d FROM t WHERE t_cid=source_id),
(SELECT e FROM t WHERE t_cid=source_id),
dest_id
);
END //
DELIMITER ;
您能否建议一个替代查询来解决此用例?
【问题讨论】:
查看meta.***.com/questions/333952/…,并考虑您是否真的需要一个程序。 【参考方案1】:INSERT ... SELECT ...
应该可以工作。
...
INSERT INTO t
(a,
...
e,
f)
SELECT a,
...
e,
dest_id
FROM t
WHERE t_cid = source_id;
...
【讨论】:
此查询无法解决用例。在我的情况下,表 t 中不存在 dest_id。它是一些常量值,例如“213”,必须将所有行的 f 列放入。 (a,b,c,d,e) 我们从 t 中挑选,但是 col f 的值我们是硬编码的 @ShivanshRajolia-HeLleR:是的,我看到它是过程的参数。但是您可以在查询中使用常量(在查询的上下文中)。在特定情况下,如果没有同名的列,它应该绑定到参数。你试过了吗? 是的,我试过了。这没用。如果您直接想将一些行从一个表传输到另一个表,则 INSERT INTO SELECT 语句可以工作......无法处理常量+无法插入到您正在从中进行选择的同一个表中。这就是为什么我尝试 INSERT INTO VALUES SELECT 仍然收到提到的错误。我认为这里可能需要其他一些查询方法。也许插入不起作用。 @ShivanshRajolia-HeLleR:在这里完美运行:dbfiddle.uk/… 一定是你做错了什么。 @ShivanshRajolia-HeLleR 。 . .这回答了您在此处提出的问题(如 db fiddle 所示)。我认为你应该接受这个答案。如果您还有其他问题,请提出新问题。以上是关于SQL 查询表中的更新行并将其插入为新行的主要内容,如果未能解决你的问题,请参考以下文章
如何在 SQL Server 2005 中进行更新插入(更新或插入)