Nếu tôi có một truy vấn nhưnếu truy vấn phụ không tương quan được lặp lại ở một số vị trí trong truy vấn, nó có thể được lưu trong bộ nhớ cache và kết quả được sử dụng lại không?
SELECT date_trunc('day', assigndate)e,
count(CASE WHEN a.assigneeid = 65548
AND a.assigneeid IN
(SELECT userid
FROM groupmembers
WHERE groupid = 65553) THEN 1 ELSE NULL END) assigned,
count(CASE WHEN a.assigneeid = 65548
AND a.completedtime IS NOT NULL
AND a.assigneeid IN
(SELECT userid
FROM groupmembers
WHERE groupid = 65553) THEN 1 ELSE NULL END) completed
FROM ASSIGNMENT a
WHERE assigndate > CURRENT_TIMESTAMP - interval '20 days'
GROUP BY date_trunc('day',assigndate);
Các subquery trong câu hỏi là
SELECT userid
FROM groupmembers
WHERE groupid = 65553
sau đó kể từ khi subquery là not co-related
với truy vấn phụ huynh, nó sẽ được thực hiện chỉ một lần và kết quả được lưu trữ sẽ đã sử dụng. Nhưng vì truy vấn con có mặt tại 2 vị trí trong truy vấn, sau đó theo số SQL plan
, nó được đánh giá hai lần. Có cách nào để cache
kết quả của truy vấn con đó và sử dụng nó ở cả hai vị trí không?
Các subquery không thể được chuyển đổi sang một tham gia như là không có trường duy nhất mà trên đó để tham gia (và nó không thể là một điều kiện tham gia, như các tính sẽ trở nên sai rồi)
Dường như bạn có biểu thức dư thừa. Không có vấn đề gì trong việc có mệnh đề "a.assigneeid = 65548" và "a.assigneeid in (subquery)" - cả hai đều đúng hoặc cả hai đều sai. – adhocgeek
Đó chỉ là lý do minh họa (logic sai!) – Daud