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