簡體   English   中英

如果查詢有行,如何只運行子查詢?

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

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM