mysql的一个坑。修改或者删除的时候不能直接调用子查询的结果集

在mysql的语法中。修改或者删除的时候不能直接调用子查询的结果集。需要先给子查询其别名。在调用。

比如:下面的去除重复项

DELETE FROM t_equipment_type t WHERE t.type = 2 
AND (t.type_code,t.type_name) IN (
  SELECT type_code,type_name FROM t_equipment_type
  GROUP BY type_code, type_name HAVING COUNT(*) > 1) 
        AND t.rec_id NOT IN (
  SELECT MIN(rec_id) FROM t_equipment_type 
  GROUP BY type_code, type_name HAVING COUNT(*) > 1)

这样会报错。

正确的写法如下:

DELETE FROM t_equipment_type WHERE rec_id IN (
SELECT b.* FROM (
SELECT rec_id FROM t_equipment_type  WHERE  
type_code IN (
SELECT type_code FROM t_equipment_type WHERE TYPE = 2
GROUP BY type_code HAVING COUNT(*) > 1)
        AND rec_id NOT IN (
SELECT MIN(rec_id) rec_id FROM t_equipment_type WHERE TYPE = 2
GROUP BY type_code,type_name HAVING COUNT(*) > 1)

) b )

 

转载于:https://www.cnblogs.com/hongzq/p/8807445.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
要在MySQL中进行递归查询子节点,可以使用以下方法: 1. 使用递归CTE(Common Table Expressions): 在MySQL 8.0版本及以上,可以使用递归CTE来实现递归查询。递归CTE允许在查询中递归引用同一表,并在每次迭代中执行递归步骤。例如: ```sql WITH RECURSIVE sub_tree AS ( SELECT id, parent_id, name FROM t_files WHERE id = <初始节点ID> UNION ALL SELECT f.id, f.parent_id, f.name FROM t_files f JOIN sub_tree st ON f.parent_id = st.id ) SELECT * FROM sub_tree; ``` 上述查询中,使用一个递归CTE子查询`sub_tree`,它首先选择初始节点,然后通过递归连接`t_files`表自身,直到找到所有子节点。 2. 使用存储过程: 如果您的MySQL版本不支持递归CTE,可以通过编写存储过程来实现递归查询。存储过程可以使用循环和条件语句来逐级查询子节点。以下是一个示例存储过程: ```sql DELIMITER // CREATE PROCEDURE get_child_nodes(IN initial_id INT) BEGIN DECLARE done INT DEFAULT FALSE; DECLARE current_id INT; DECLARE child_id INT; DECLARE child_name VARCHAR(255); DECLARE cur CURSOR FOR SELECT id, name FROM t_files WHERE parent_id = initial_id; DECLARE CONTINUE HANDLER FOR NOT FOUND SET done = TRUE; CREATE TEMPORARY TABLE IF NOT EXISTS temp_results (id INT, name VARCHAR(255)); OPEN cur; read_loop: LOOP FETCH cur INTO child_id, child_name; IF done THEN LEAVE read_loop; END IF; INSERT INTO temp_results VALUES (child_id, child_name); CALL get_child_nodes(child_id); END LOOP; CLOSE cur; SELECT * FROM temp_results; DROP TEMPORARY TABLE IF EXISTS temp_results; END // DELIMITER ; ``` 在上述存储过程中,通过使用游标和递归调用存储过程来获取所有子节点,并将结果存储在一个临时表中。 以上是两种常用的方法来在MySQL中进行递归查询子节点。您可以根据您的具体需求选择适合您的方法。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值