我的SELECT语句有效,但我无法删除

时间:2015-06-01 14:34:25

标签: mysql sql

我有一个有效的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有效。任何帮助将不胜感激。

2 个答案:

答案 0 :(得分:4)

  

您不能使用表别名,必须使用表中的完整表名   NOT EXISTS查询的一部分。

Source

答案 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

相关问题