【问题标题】:MySQL Delete: two similar codes, only one worksMySQL Delete:两个相似的代码,只有一个有效
【发布时间】:2016-06-05 10:02:33
【问题描述】:

我有两个相似的 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,并且都使用派生表。那么,为什么第一个不起作用,而第二个起作用呢?

提前致谢!

【问题讨论】:

  • DELETE ES.* ?在第二个代码中,您尝试删除 E,而不是 ES。或者我什么都不懂
  • @Max 第一次查询表别名为ES,第二次查询为E ..
  • @leoll2 这是对您遇到的错误的一些解释——stackoverflow.com/questions/45494/…
  • 这不是我的问题,我只是回答了你的问题。 @Max
  • 还有 leoll2 ,你的问题的答案在他的链接中。子查询的使用 -> 2 &lt;= (SELECT..) 是问题的原因。

标签: mysql sql-delete


【解决方案1】:

在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;

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

【讨论】:

    猜你喜欢
    • 2019-03-04
    • 1970-01-01
    • 2020-06-26
    • 1970-01-01
    • 2016-03-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多