我有以下情况:
涉及3个表格,'患者','用户'和' center'。它们具有以下属性和关系:
'患者':
'用户':
'中心':
患者不能直接分配到中心。相反,它们被分配给特定用户,而特定用户又被分配到一个中心。
' localid'患者目前被设定为' -1'适用于所有患者。我试图提出一个SQL查询,它会增加“本地化”的权限。对于所有患者,但仅在中心内,他们通过用户间接关联。
从本质上讲,我希望所有患者在其中心都有一个唯一的ID,但每个中心的起始值应为0。
这是我尝试的查询,我认为这与我的需求很接近:
UPDATE patient p1
SET p1.localid=(SELECT (max(p2.localid) +1)
FROM patient p2
WHERE (SELECT u1.cid
FROM users u1
WHERE u1.uid=p1.doc)=(SELECT u2.cid
FROM users u2
WHERE u2.uid=p2.doc));
这会导致sql错误"您无法指定目标表' p1'用于FROM子句中的更新"因为' p1'在WHERE子句中引用自身。
我可以通过在PHP中使用多个SQL查询和循环来轻松解决此问题,但我想知道是否可以使用纯SQL解决此问题?
答案 0 :(得分:1)
您可以使用子查询中的条件将表JOIN
{而不是使用子查询 - 而不是使用子查询,并为其指定别名。这应该允许您更新您正在查询的同一个表。
像...一样的东西。
UPDATE patient p1
SET p1.localid = p2.newlocalid
INNER JOIN (
SELECT pid, MAX(localid) + 1 AS newlocalid
FROM patient p2
WHERE...
) p2 ON p1.pid = p2.pid