簡體   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