我需要从 UPDATE 命令中的查询中引用 cartProduct 派生表。有人可以解释一下我做错了什么以及如何解决它。
UPDATE memberships SET points = (points + COALESCE(
(SELECT pts
FROM (
SELECT pid0, SUM (S) as Pts
FROM (
(SELECT pid0, SUM (pts1) as S
FROM
(SELECT DISTINCT pid0, pid0,pts1
FROM cartProduct
WHERE pid0 = i1) as pointsForPath
GROUP BY pid0)) as allPtsTbl
GROUP BY pid0) as temp
WHERE memberships.cid = 57010 AND memberships.pid = temp.pid0 ),
0))
FROM (
SELECT t0.pid as pid0,t1.pid as pid1,t1.invitedby as i1,t1.points as pts1, t2.pid as pid2,t2.invitedby as i2,t2.points as pts2,t3.pid as pid3,t3.invitedby as i3, t3.points as pts3
FROM memberships t0, memberships t1, memberships t2, memberships t3
WHERE t0.cid = t1.cid AND t1.cid = t2.cid AND t2.cid = t3.cid) as cartProduct;
这个查询必须做什么并不重要,因为它是我想要优化的一小部分复杂查询。我唯一的问题是如何从 UPDATE 子查询中引用 cartProduct 。我要优化的查询是由 C 代码生成的......如您所见,我必须多次计算相同的东西。这个查询只有 3 个派生表,但它也可以是 100+,然后我必须等待 10 多个小时才能计算它。
UPDATE memberships SET points = points + COALESCE((
SELECT pts
FROM (
SELECT pid0, SUM (S) as Pts
FROM (
SELECT pid0, SUM (pts1) as S
FROM
(SELECT DISTINCT pid0, pid1,pts1
FROM (
SELECT t0.pid as pid0, t1.pid as pid1, t1.invitedby as i1, t1.points as pts1
FROM memberships t0, memberships t1
WHERE t0.cid = 57010 AND t1.cid = 57010) as paths
WHERE pid0 = i1) as pointsForPath
GROUP BY pid0
UNION ALL
SELECT pid0, SUM (pts2) as S
FROM (
SELECT DISTINCT pid0, pid2,pts2
FROM (
SELECT t0.pid as pid0, t1.pid as pid1, t1.invitedby as i1, t1.points as pts1 , t2.pid as pid2, t2.invitedby as i2, t2.points as pts2
FROM memberships t0, memberships t1, memberships t2
WHERE t0.cid = 57010 AND t1.cid = 57010 AND t2.cid = 57010) as paths
WHERE pid0 = i1 AND pid1 = i2) as pointsForPath
GROUP BY pid0
UNION ALL
SELECT pid0, SUM (pts3) as S
FROM (
SELECT DISTINCT pid0, pid3,pts3
FROM (
SELECT t0.pid as pid0, t1.pid as pid1, t1.invitedby as i1, t1.points as pts1 , t2.pid as pid2, t2.invitedby as i2, t2.points as pts2 , t3.pid as pid3, t3.invitedby as i3, t3.points as pts3
FROM memberships t0, memberships t1, memberships t2, memberships t3
WHERE t0.cid = 57010 AND t1.cid = 57010 AND t2.cid = 57010 AND t3.cid = 57010) as paths
WHERE pid0 = i1 AND pid1 = i2 AND pid2 = i3) as pointsForPath
GROUP BY pid0 ) as allPtsTbl
GROUP BY pid0) as temp WHERE memberships.cid = 57010 AND memberships.pid = temp.pid0 ),0)
对不起我的英语不好,非常感谢。