连接含同名临时表的SQL函数返回表,是否存在临时表冲突风险?
关于SQL函数同名临时表在JOIN中的执行逻辑问题
结论:完全不用担心my_function_1创建的tmp_result被my_function_2提前删除,也不存在潜在冲突问题,原因如下:
函数执行的上下文隔离:每个SQL函数调用都是独立的执行单元,函数内部创建的临时表,其生命周期严格绑定在函数自身的执行过程中。不管函数里有没有写
DROP TABLE IF EXISTS,多数数据库都会在函数执行完成、返回结果集后自动清理这些临时表。也就是说,my_function_1执行完毕返回结果时,它创建的tmp_result已经被销毁了,根本不会留在会话里和my_function_2的临时表产生交集。执行顺序不影响隔离性:虽然数据库优化器可能会根据实际情况调整两个函数的执行顺序(比如先跑my_function_2再跑my_function_1,甚至并行执行),但每个函数的临时表都是在自己的私有执行上下文里创建、使用、销毁的,互相之间完全看不到对方的临时表,自然不会出现误删的情况。你测试结果正常,就是这种隔离机制在起作用。
额外补充:如果你的函数里显式写了
DROP TABLE IF EXISTS,这只会作用于当前函数执行上下文里的临时表,不会影响其他函数的执行流程——因为其他函数的临时表还没创建(或者已经销毁了)。
你的示例查询代码:
select a.*, b.* from my_function_1(1,2,3) a join my_function_2(4,5,6) b on a.id=b.id order by 1;
内容的提问来源于stack exchange,提问作者sguo
相关产品推荐
相关产品推荐

