2010-03-23 13 views
5

में किसी प्रक्रिया में चयन क्वेरी का पुन: उपयोग करें मैं एक चयन कथन का परिणाम कैसे संग्रहीत करूं ताकि मैं परिणामों को अन्य प्रश्नों के लिए in खंड के साथ पुन: उपयोग कर सकूं? यहाँ कुछ छद्म कोड है:ओरेकल

declare 
    ids <type?>; 
begin 
    ids := select id from table_with_ids; 
    select * from table1 where id in (ids); 
    select * from table2 where id in (ids); 
end; 

... या अनुकूलक मेरे लिए यह करना होगा, अगर मैं बस दोनों का चयन करें बयान में उप क्वेरी डाल?

संपादित करें: यहां मेरी टेबल की संरचना के बारे में अधिक जानकारी है।

मूल रूप से तालिका 1 एक मानक तालिका है जिसमें आईडी प्राथमिक कुंजी है। जबकि तालिका 2 में 3 कॉलम प्राथमिक कुंजी है जिसमें आईडी उन स्तंभों में से एक है। मेरे मामले में तालिका 2 में आईडी तीन पंक्तियों में दिखाई देगी।

उत्तर

7

आप चयन के परिणाम को संग्रहीत करने और पुन: उपयोग करने के लिए SQL तालिका ऑब्जेक्ट का उपयोग कर सकते हैं। यह अधिक स्मृति का उपभोग करेगा और शायद तभी प्रभावी होगा जब पहले चयन में बहुत समय लगेगा।

CREATE TYPE tab_number IS TABLE OF NUMBER; 
/

आप एक बल्क के साथ यह प्रयोग करेंगे खंड जांच इकट्ठा:

DECLARE 
    ids tab_number; 
BEGIN 
    SELECT id BULK COLLECT INTO ids FROM table_with_ids; 
    SELECT * /*into ??*/ 
    FROM table1 
    WHERE id IN (SELECT column_value FROM TABLE(ids)); 
    SELECT * /*into ??*/ 
    FROM table2 
    WHERE id IN (SELECT column_value FROM TABLE(ids)); 
END; 

संस्करण 9i में और इससे पहले कि आप तालिका क्वेरी करने के लिए कास्ट का उपयोग करने की आवश्यकता होगी: वैकल्पिक रूप से

SELECT * 
    FROM table2 
WHERE id IN (SELECT column_value FROM CAST (TABLE(ids) AS tab_number)); 

, इंटरमीडिएट परिणाम सेट को स्टोर करने के लिए आप GLOBAL TEMPORARY TABLE का उपयोग कर सकते हैं।

+0

@ पीटर: आप सही हैं, मैंने अपने कोड (!) का परीक्षण नहीं किया। मैंने अपना जवाब अपडेट किया, धन्यवाद। –

+0

बहुत बहुत धन्यवाद! – Jeremy