त्रुटि संदेश बल्कि स्पष्ट है, जब आप इसका उपयोग कर रहे हों तो आप एक अस्थायी तालिका नहीं छोड़ सकते।
आप ON COMMIT DROP
. जोड़कर समस्या से बचने में सक्षम हो सकते हैं :
हालांकि, यह शायद आसान हो सकता है। अगर आपको ज़रूरत नहीं है उन सभी अस्थायी तालिकाओं के साथ शुरू करने के लिए (जो मुझे संदेह है), आप उन सभी को सीटीई (या उनमें से अधिकतर सस्ता सबक्वायरी के साथ भी) के साथ बदल सकते हैं और एक बड़ी क्वेरी को सरल बना सकते हैं। Plpgsql या सिर्फ SQL हो सकता है:
CREATE FUNCTION everything(waypoints)
RETURNS TABLE(node int, xy text[]) AS
$func$
WITH bbox AS (SELECT ... FROM waypoints) -- not the fct. parameter!
, b_spaces AS (SELECT ... )
, b_graph AS (SELECT ... )
, local_green AS (SELECT ... )
, aug_temp AS (SELECT ... )
, b_graph2(source, target, cost) AS (
SELECT ... FROM b_graph
UNION ALL -- guessing you really want UNION ALL
SELECT ... FROM aug_temp
UNION ALL
SELECT ... FROM aug_temp
)
, results AS (SELECT id1, ... FROM b_graph2)
, pkg AS (SELECT loc, ... )
SELECT id1, array_agg(loc)
FROM pkg
GROUP BY id1
$func$ LANGUAGE sql;
दृश्य केवल एक क्वेरी ("नुस्खा") संग्रहीत कर रहे हैं, वास्तविक परिणामी मान ("सूप") नहीं।
आमतौर पर अस्थायी तालिकाएँ बनाने के बजाय CTE का उपयोग करना सस्ता होता है।
प्रश्नों में व्युत्पन्न तालिकाएँ , उनके विशिष्ट समग्र प्रदर्शन (इंडेक्स से जुड़े विशेष मामलों के अपवाद) के आधार पर क्रमबद्ध। धीमे से तेज़ की ओर:
CREATE TABLE
CREATE UNLOGGED TABLE
CREATE TEMP TABLE
CTE
subquery
UNION
डुप्लिकेट पंक्तियों को मोड़ने का प्रयास करेंगे। आमतौर पर, लोग वास्तव में UNION ALL
want चाहते हैं , जो सिर्फ पंक्तियों को जोड़ता है। तेजी से और धोखे को हटाने की कोशिश नहीं करता है।