我有一个有效的SQL查询,它返回需要从数据库中删除的信息。我很难用这些信息删除记录。
我正在使用mySQL数据库,我正在尝试使用HeidiSQL进行这些更改。
用于选择数据的代码是:
SELECT *
FROM users u
WHERE NOT EXISTS
(SELECT 1
from users_classdetails uc
WHERE u.id = uc.userID
AND dateEntered > DATE_SUB(NOW(),INTERVAL 3 YEAR) )
AND bestcontact = ""
我希望能够使用类似的东西:
DELETE
FROM users u
WHERE NOT EXISTS
(SELECT 1
from users_classdetails uc
WHERE u.id = uc.userID
AND dateEntered > DATE_SUB(NOW(),INTERVAL 3 YEAR) )
AND bestcontact = ""
但是我显示错误1064,这解释了我的语法错误。它指出WHERE NOT EXISTS ( SELECT 1 from users_classdetails
是问题所在。我不确定为什么它对SELECT
有效,但不对DELETE
有效。任何帮助将不胜感激。
答案 0 :(得分:4)
您不能使用表别名,必须使用表中的完整表名 NOT EXISTS查询的一部分。
答案 1 :(得分:0)
您可以在u.*
之后添加DELETE
,该语句应该适合您。
"多表格语法"对于DELETE语句。参考:[https://dev.mysql.com/doc/refman/5.5/en/delete.html]。
如果您使用了反连接模式(正如评论中建议的人那样),那么您需要使用相同形式的声明。
您的SELECT语句可以写成
SELECT u.*
FROM users u
WHERE ...
要将其更改为删除语句,只需将SELECT
关键字替换为DELETE
...
DELETE u.*
FROM users u
WHERE ...
要使用JOIN,您需要一个反连接模式来模拟NOT EXISTS。这是一个左外连接,用于返回用户的所有行,以及来自另一个表的匹配行,以及排除所有匹配的行的谓词,从而留下来自不具有匹配的用户的行比赛。
同样,要从用户返回行,请在SELECT语句中指定u.*
。这是一个反连接模式的示例,它返回与NOT EXISTS
查询等效的结果:
SELECT u.*
FROM users u
LEFT
JOIN users_classdetails uc
ON uc.userID = u.id
AND uc.dateEntered > NOW() + INTERVAL -3 YEAR
WHERE uc.userID IS NULL
AND u.bestcontact = ''
要将其转换为DELETE语句,只需将SELECT
替换为DELETE
。