[英]How to only run subquery if query has rows?
我正在像這樣在mysql中運行更新查詢。 當且僅當 mycount為null時,它才設計為更新mytable中記錄5的mycount和mysum列。
如果不為null,則沒有要更新的行,但是子查詢仍然可以運行,這很昂貴。 有什么方法可以創建僅在有任何要更新的情況下才運行子查詢的查詢?
UPDATE mytable
CROSS JOIN (
SELECT COUNT(*) thiscount, SUM(mycolumn) thissum
FROM(
SELECT mycount, mysum
FROM <some complicated query>
)t
)t2
SET mycount=thiscount,
mysum=thissum
WHERE id=5;
AND mycount IS NULL;
如果有行,此版本應僅運行子查詢。 但是,它的缺點是對於要更新的每一行都要運行兩次:
UPDATE mytable
SET mycount = (SELECT COUNT(*) as thiscount
FROM (SELECT mycount, mysum
FROM <some complicated query>
) t
),
mysum = (SELECT SUM(mycolumn) as thissum
FROM (SELECT mycount, mysum
FROM <some complicated query>
) t
)
WHERE id = 5 AND mycount IS NULL;
只要子查詢不包含mytable
就可以執行此操作。
編輯:
我不確定以下各項是否一定能奏效,但實際上可能可行:
UPDATE mytable
SET mycount = (SELECT (CASE WHEN @x := SUM(mycolumn) THEN COUNT(*)
ELSE COUNT(*)
END) as thiscount
FROM (SELECT mycount, mysum
FROM <some complicated query>
) t
),
mysum = @x
WHERE id = 5 AND mycount IS NULL;
我只是認為MySQL不保證set
子句的求值順序。 但這通常會按書面要求進行。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.