MySQL删除:两个相似的代码,只有一个有效

时间:2016-06-05 10:02:33

标签: mysql sql-delete

我有两个类似的SQL查询来解决问题,但只有第二个可以解决问题。

问题是:

  

仅考虑肌肉疾病,写下一个查询,删除至少有两种(肌肉)疾病患者的起病,最终恢复。

数据库具有以下结构:

Onset (Patient,Pathology,OnsetDate,RecoveryDate)
Pathology (Name,BodyPart)

这是我的第一个代码:

DELETE ES.* 
FROM Onset ES NATURAL JOIN
(
SELECT E.Patient, E.Pathology, E.OnsetDate
FROM Onset E INNER JOIN Pathology P ON E.Pathology=P.Name
WHERE P.BodyPart='Muscles'
      AND E.RecoveryDate IS NOT NULL
      AND 2<=(SELECT COUNT(DISTINCT E2.Pathology)
              FROM Onset E2 INNER JOIN Pathology P2 ON E2.Pathology=P2.Name
              WHERE P2.BodyPart='Muscles'
                    AND E2.Patient=E.Patient
                    AND E2.RecoveryDate IS NOT NULL
             )
) AS D;

这是我的第二个代码:

DELETE E.* FROM Onset E 
INNER JOIN Pathology PA ON E.Pathology = PA.Name
NATURAL JOIN(
    SELECT E2.Patient
    FROM Onset E2 INNER JOIN Pathology P ON E2.Pathology = P.Name
    WHERE E2.RecoveryDate IS NOT NULL
        AND P.BodyPart = 'Muscles'
    GROUP BY E2.Patient
    HAVING COUNT(DISTINCT E2.Pathology) >= 2
) AS D
WHERE PA.BodyPart = 'Muscles'
   AND E.RecoveryDate IS NOT NULL;

第二个代码工作正常,而第一个代码则返回常见错误:

  

错误代码:1093。您无法在更新中指定目标表'ES'   FROM子句

我知道当您尝试从子查询中使用的表中删除时会发生这种情况,并且您可以使用派生表来绕过它。 虽然,我的代码都在子查询中使用Onset,并且都使用派生表。那么,为什么第一个不起作用,而第二个呢?

提前致谢!

1 个答案:

答案 0 :(得分:0)

在delete子句中删除from子句

 DELETE ES  
 NATURAL JOIN
 (
 SELECT E.Patient, E.Pathology, E.OnsetDate
 FROM Onset E INNER JOIN Pathology P ON E.Pathology=P.Name
 WHERE P.BodyPart='Muscles'
      AND E.RecoveryDate IS NOT NULL
      AND 2<=(SELECT COUNT(DISTINCT E2.Pathology)
              FROM Onset E2 INNER JOIN Pathology P2 ON E2.Pathology=P2.Name
              WHERE P2.BodyPart='Muscles'
                    AND E2.Patient=E.Patient
                    AND E2.RecoveryDate IS NOT NULL
             )
 ) AS D;

确保你有一个合适的(在哪里)条件;