在UPDATE查询中自引用MySQL表

时间:2014-09-04 10:10:04

标签: mysql sql

我有以下情况:

涉及3个表格,'患者','用户'和' center'。它们具有以下属性和关系:

'患者':

  • pid =主键
  • doc =外键' uid' '用户'
  • localid =设置为' -1'默认情况下

'用户':

  • uid =主键
  • cid =&cid'的外键' center'

'中心':

  • cid =主键

患者不能直接分配到中心。相反,它们被分配给特定用户,而特定用户又被分配到一个中心。

' 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解决此问题?

1 个答案:

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