mysql 如何对一张表进行嵌套查询

mysql 如何对一张表进行嵌套查询,第1张

不可以哦,这不是MYSQL的问题,数据库都有这个规定:不允许UPDATE的子查询里面有被UPDATE的那个表。

我一般采取两种方法,一是利用SQL文本:

SELECT CONCAT("UPDATE RES_OBJECT SET MULTISELECT_ID=",

B.MULTISELECT_ID,"WHERE RES_ID=",A.RES_ID,"")

INTO OUTFILE ABC.SQL

FROM RES_OBJECT A,RES_OBJECT B

WHERE B.RES_ID=A.PARENT_NODE_RES_ID)

AND (RES_OBJECT.MULTISELECT_ID IS NULL OR RES_OBJECT.MULTISELECT_ID=0)

SOURCE ABC.SQL

另外一种方法是利用临时表:

SELECT B.MULTISELECT_ID,A.RES_ID

FROM RES_OBJECT A,RES_OBJECT B

WHERE B.RES_ID=A.PARENT_NODE_RES_ID)

AND (RES_OBJECT.MULTISELECT_ID IS NULL OR RES_OBJECT.MULTISELECT_ID=0)

INTO TEMP TABLE TMP

UPDATE RES_OBJECT SET MULTISELECT_ID=

(SELECT MULTISELECT_ID FROM TMP WHERE TMP.RES_ID=RES_OBJECT.RES_ID)

WHERE EXISTS

(SELECT MULTISELECT_ID FROM TMP WHERE TMP.RES_ID=RES_OBJECT.RES_ID)

MySQL 需要创建隐式临时表来解决某些类型的查询。往往查询的排序阶段需要依赖临时表。例如,当您使用 GROUP BY,ORDER BY 或DISTINCT 时。这样的查询分两个阶段执行:首先是收集数据并将它们放入临时表中,然后是在临时表上执行排序。

对于某些 UNION 语句,不能合并的 VIEW,子查询时用到派生表,多表 UPDATE 以及其他一些情况,还需要使用临时表。如果临时表很小,可以到内存中创建,否则它将在磁盘上创建。MySQL 在内存中创建了一个表,如果它变得太大,就会被转换为磁盘上存储。内存临时表的最大值由 tmp_table_size 或 max_heap_table_size 值定义,以较小者为准。MySQL 5.7 中的默认大小为 16MB。如果运行查询的数据量较大,或者尚未查询优化,则可以增加该值。设置阈值时,请考虑可用的 RAM 大小以及峰值期间的并发连接数。你无法无限期地增加变量,因为在某些时候你需要让 MySQL 使用磁盘上的临时表。

注意:如果涉及的表具有 TEXT 或 BLOB 列,则即使大小小于配置的阈值,也会在磁盘上创建临时表。


欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/zaji/7315101.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-04-04
下一篇 2023-04-04

发表评论

登录后才能评论

评论列表(0条)

保存