2013-11-25 57 views
0

我意识到什么是下面不工作:有没有办法在MySQL中做到这一点?

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,并保留文件修剪,我想将它保存为宏,而不是在每个查询中输入它。

有没有办法做到上述?我已经查看了存储的函数和过程以及游标,但还没有找到一个好的解决方案。

+2

为什么不把结果集写入临时内存表或类似的东西? –

+2

如果'@ T'是SELECT查询的结果,并且您想多次使用,则可以将其存储在(临时)表中。 –

+0

大家好,这是个好主意,谢谢! – ktm5124

回答

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 ...; 
相关问题