1

我正在尝试创建一个存储过程,其中包括使用来自其他表的信息更新一个表:

UPDATE table1 T1, table2 T2
set T1.rank = T1.rank + T2.rank
T1.tags = merge(T1.tags, T2.tags)
WHERE T1.id = T2.id

tags 是逗号分隔的字符串,merge 是一个函数(不是过程),它将字符串分解为临时表并使用准备好的语句返回具有唯一标签的新字符串。我知道不能在函数内部使用准备好的语句,但使用这些语句的部分是在函数内部调用的过程内部。

所以我得到一个错误,我不能在函数中使用动态 sql 过程,我需要这个函数,所以我可以使用返回值作为更新中的新值。

任何可能的方法来实现这一目标?

4

1 回答 1

0

您可以使用纯 SQL 在一条语句中执行此操作(使用合并标签进行更新)。诀窍在于使用一个数字(也称为计数表),它可以在几秒钟内创建和填充(也可以使用一条 SQL 语句)。

这是你的UPDATE声明

UPDATE table1 t1 JOIN table2 t2
    ON t1.id = t2.id JOIN
(
  SELECT id, GROUP_CONCAT(DISTINCT tag ORDER BY tag) tags
    FROM
  (
     SELECT a.id, SUBSTRING_INDEX(SUBSTRING_INDEX(tags, ',', n.id), ',', -1) tag
       FROM
    (
       SELECT t1.id, CONCAT(t1.tags, ',', t2.tags) tags
         FROM table1 t1 JOIN table2 t2
           ON t1.id = t2.id
    ) a CROSS JOIN tally n
     WHERE n.id <= 1 + (LENGTH(tags) - LENGTH(REPLACE(tags, ',', '')))
       AND n.id < 100 -- change that number to accommodate max possible number of tags 
  ) b
   GROUP BY id
) c ON t1.id = c.id
   SET t1.tags = c.tags,
       t1.rank = t1.rank + t2.rank

这是用多达 100k 行填充计数表的模式和语句。

CREATE TABLE tally (id INT NOT NULL AUTO_INCREMENT PRIMARY KEY);

INSERT INTO tally 
SELECT NULL
FROM (SELECT 0 n UNION ALL SELECT 1 UNION ALL SELECT 2 UNION ALL SELECT 3 UNION ALL SELECT 4 UNION ALL SELECT 5 UNION ALL SELECT 6 UNION ALL SELECT 7 UNION ALL SELECT 8 UNION ALL SELECT 9) a
      , (SELECT 0 n UNION ALL SELECT 1 UNION ALL SELECT 2 UNION ALL SELECT 3 UNION ALL SELECT 4 UNION ALL SELECT 5 UNION ALL SELECT 6 UNION ALL SELECT 7 UNION ALL SELECT 8 UNION ALL SELECT 9) b
      , (SELECT 0 n UNION ALL SELECT 1 UNION ALL SELECT 2 UNION ALL SELECT 3 UNION ALL SELECT 4 UNION ALL SELECT 5 UNION ALL SELECT 6 UNION ALL SELECT 7 UNION ALL SELECT 8 UNION ALL SELECT 9) c
      , (SELECT 0 n UNION ALL SELECT 1 UNION ALL SELECT 2 UNION ALL SELECT 3 UNION ALL SELECT 4 UNION ALL SELECT 5 UNION ALL SELECT 6 UNION ALL SELECT 7 UNION ALL SELECT 8 UNION ALL SELECT 9) d
      , (SELECT 0 n UNION ALL SELECT 1 UNION ALL SELECT 2 UNION ALL SELECT 3 UNION ALL SELECT 4 UNION ALL SELECT 5 UNION ALL SELECT 6 UNION ALL SELECT 7 UNION ALL SELECT 8 UNION ALL SELECT 9) e
;

这是SQLFiddle演示

于 2013-06-26T09:24:06.973 回答