【发布时间】: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 <= (SELECT..)是问题的原因。
标签: mysql sql-delete