我意识到下面的内容不起作用:
set @T := (select A, group_concat(B) from X inner join Z on ...);
update T1 inner join @T as T2 on T1.A=T2.A
set ...
但从概念上讲,这就是我想做的事情。我将在我的SQL文件中使用结果集@T,并保持文件修剪我想将其保存到宏而不是在每个查询中输入它。
有没有办法做到以上几点?我已经查看了存储的函数和过程以及游标,但还没有找到一个很好的解决方案。
答案 0 :(得分:1)
评论提出了使用临时表的好建议。我将发布一个例子并将我的答案标记为CW。
CREATE TEMPORARY TABLE TempT AS SELECT A, GROUP_CONCAT(B) FROM X INNER JOIN Z ON ...;
UPDATE T1 INNER JOIN TempT AS T2 ON T1.A=T2.A
SET ...
并非临时表作用于当前会话。也就是说,它只对创建它的会话可见,并在会话结束时自动删除。
如果希望此表持久且对多个会话可见,则不能使用TEMPORARY选项。只需将表创建为普通表。存储聚合结果时,通常将其称为摘要表。
然后,您需要做出一些设计决策,以确定截断它的频率,并使用当前数据重新填充它。这取决于你的判断 - 没有正确的答案,而且是one of the hardest problems in computer science to solve。
如果您希望方便使用临时表,但需要与其他数据保持100%同步,而不必担心更新频率,可以考虑定义VIEW。
CREATE OR REPLACE VIEW TempT AS SELECT A, GROUP_CONCAT(B) FROM X INNER JOIN Z ON ...;