繁体   English   中英

为什么我的更新查询不接受联合子查询作为列值表达式?

[英]Why is my update query not accepting union subquery as the column value expression?

我正在尝试使此查询起作用。 帐户表与许多用户表行具有 1:N 关系。 Account 表还有一个引用 User 表的列,称为admin_id 我正在尝试确保使用正确的主管理员更新所有具有 admin_id=null 的帐户。 如果有的话,那是唯一的所有者(最多可以有一个),否则是具有最低 id 的管理员(首先创建)。 已删除用户的列已删除,而不是deletedAt ,这些用户永远不会被考虑。 如果用户是管理员或所有者由 User 表的role列表示(还有其他角色,但我们不想分配给 admin_id)。 如果没有所有者或管理员,则 admin_id 列应保留为 null。

UPDATE Account c
SET c.admin_id = (
  (
      SELECT u.id AS id
      FROM User u
      WHERE u.account_id = Account.id
      AND u.role IN ("admin", "owner")
      AND u.deletedAt IS NULL
      ORDER BY u.role DESC, u.id ASC
      LIMIT 1
  ) # << here mysql workbench reports missing parenthesis
  UNION
  (
    SELECT NULL AS id
  )
  LIMIT 1
)
WHERE c.admin_id IS NULL

但是 mysql 工作台报告UNION关键字之前缺少括号。 并且 db 服务器也响应语法错误。 但是当我从分配中复制整个联合(省略对 Account 表的引用)并运行它时,它会返回我想要的。

知道有什么问题吗?

也欢迎建议以不同的方式做同样的事情......

使用 10.2.31-MariaDB-1:10.2.31+maria~bionic

我不知道您当前的更新逻辑是否正确,但是NULL值的联合是多余的,因为如果第一个子查询找不到任何内容,默认情况下它会返回NULL 所以,你可以简单地写:

UPDATE Account c
SET admin_id = (
    SELECT u.id AS id
    FROM User u
    WHERE u.account_id = c.id          AND
          u.role IN ('admin', 'owner') AND
          u.deletedAt IS NULL
    ORDER BY u.role DESC, u.id
    LIMIT 1
)
WHERE admin_id IS NULL;

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM