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