[英]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.