【发布时间】:2012-03-25 20:37:02
【问题描述】:
我是存储过程的新手,无需检查查询是否正常工作,但任何更好的代码都会非常受欢迎。
我有两个表
1.Users===>主记录表
2 .temp_Users===> 表包含更新的当前用户信息
我需要的任务是
A.检查需要删除的用户。
B.添加不在表中的新用户用户来自表 temp_Users
DELIMITER //
CREATE PROCEDURE checkUsers()
BEGIN
DECLARE oldusers, newusers INT DEFAULT 0
//To catch delete users
SELECT COUNT(Users.Ext) INTO oldusers
FROM Users
LEFT JOIN temp_Users
ON temp_Users.Ext=Users.Ext
WHERE temp_Users.Ext IS NULL;
//To catch new users
SELECT COUNT(temp_Users.Ext) INTO newusers
FROM Users
RIGHT JOIN temp_Users
ON temp_Users.Ext=Users.Ext
WHERE Users.Ext IS NULL;
CASE
WHEN oldusers>0
THEN DELETE FROM Users SELECT Users.Ext
FROM Users
LEFT JOIN temp_Users
ON temp_Users.Ext=Users.Ext
WHERE temp_Users.Ext IS NULL;
WHEN newusers>0
THEN INSERT INTO Users (Ext) SELECT temp_Users.Ext
FROM Users
RIGHT JOIN temp_Users
ON temp_Users.Ext=Users.Ext
WHERE Users.Ext IS NULL;
ELSE exit;
END CASE;
END //
DELIMITER ;
【问题讨论】:
-
您可以删除初始的
SELECT语句,以及对oldusers和newusers的分配,也可以删除CASE。只需运行DELETE和INSERT语句;如果有符合条件的行,则将执行该操作,如果没有,则不会执行。您不需要COUNT或变量。 -
@KenWhite 是的,这将是我的最后一个选择,但需要了解如何使用它。
-
您想学习如何编写不需要的代码?恐怕这没有任何意义——你要求更好的代码,我告诉你需要什么才能获得更好的代码(去掉不必要的东西)。 :)
-
@KenWhite 请告诉我为什么我的以下查询不起作用? DELETE FROM Users SELECT Users.Ext FROM Users LEFT JOIN temp_Users ON temp_Users.Ext=Users.Ext WHERE temp_Users.Ext IS NULL
-
您的语法错误。 (未测试 - 我不是 MySQL 用户,所以您需要先仔细测试一下!)
DELETE FROM Users WHERE Users.Ext IN (SELECT Users.Ext FROM Users u LEFT JOIN temp_Users t on t.Ext = u.Ext WHERE t.Ext IS NULL)应该可以工作。 (顺便说一句,这应该是一个单独的问题。:))
标签: mysql database stored-procedures