2014-10-09 10 views
5

Oracle SQL डेवलपर में, मैं खंड के साथ एक का उपयोग कर रहा है, इस (सरलीकृत) रास्ते में:एसक्यूएल: पैरामीटर के साथ खंड के साथ?

WITH 
foos AS 
    SELECT * 
    FROM my_table 
    WHERE field = 'foo' 
bars AS 
    SELECT * 
    FROM my_table 
    WHERE field = 'bar' 
SELECT * 
FROM foo 
INNER JOIN bar 
ON foo.id = bar.id 

मैं 'foo' और 'बार' तार को अलग करने में सक्षम होना चाहते हैं, ताकि मैं

WITH 
subq(my_arg) AS 
    SELECT * 
    FROM my_table 
    WHERE field = my_arg 
SELECT * 
FROM subq('foo') 
INNER JOIN subq('bar') 
ON subq('foo').id = subq('foo').id 

वजह से, foos और bars वास्तव में इस से काफी बड़ा है, और अखरोट सिर्फ उनमें से दो देखते हैं, तो यह एक बिट बनाए रखने के लिए मुश्किल हो रहा है: की तरह कुछ हो सकता है।

मुझे पता है कि यह एक खंड के साथ संभव नहीं हो सकता है, लेकिन इस सबक्वायरी को कई बार लिखने से बचने का सबसे अच्छा समाधान क्या होगा? यह वास्तव में काफी सरल हो सकता है, लेकिन मैं एसक्यूएल के लिए काफी नया हूं ...

आपकी मदद के लिए धन्यवाद।

उत्तर

0

इस प्रयास करें:

WITH subq AS (
    SELECT * 
    FROM my_table 
) 
SELECT * 
    FROM subq s1 
    , subq s2 
WHERE s1.id = s2.id 
    AND s1.field = 'foo' 
    AND s2.field = 'bar' 

या आप इस तरह pipelined फ़ंक्शन का उपयोग कर सकते हैं:

CREATE TYPE t_tf_tab IS TABLE OF MY_TABLE%ROWTYPE; 

CREATE OR REPLACE FUNCTION get_table_vals (
    p_val IN VARCHAR 
) 
RETURN t_tf_tab 
PIPELINED 
AS 
BEGIN 
    FOR i IN (SELECT * FROM MY_TABLE WHERE FIELD = p_val) 
    PIPE ROW(t_tf_row(i.id, i.field, ...)); 
    END LOOP; 
    RETURN; 
END; 

SELECT * 
    FROM TABLE(get_table_vals('foo')) s1 
    , TABLE(get_table_vals('bar')) s2 
where s1.id = s2.id 
0

आप अगले एक में अभिव्यक्ति के साथ एक का पुन: उपयोग कर सकते हैं। लेकिन जहां तक ​​मुझे पता है कि आप इसे parametrize नहीं कर सकते हैं। तो यह मदद कर सकता है हो सकता है:

SELECT * 
FROM my_table foo 
JOIN my_table bar ON foo.id = bar.id 
JOIN my_table baz ON foo.id = baz.id 
WHERE foo.field = 'foo' 
AND bar.field = 'bar' 
AND baz.field = 'baz' 

खंड के साथ एक बहुत कर रही है (और मूल्य दोहरा नहीं) यदि:

WITH 
foosAndbars AS 
    (SELECT * 
    FROM [Very complex query]). 
foos AS (
    SELECT * 
    FROM foosAndbars 
    WHERE field = 'foo'), 
bars AS (
    SELECT * 
    FROM foosAndbars 
    WHERE field = 'bar') 
SELECT * 
FROM foo 
INNER JOIN bar 
ON foo.id = bar.id 
1

यह इस हो सकता है कि आप क्या चाहते लगता

WITH cte AS SELECT * FROM mytable <with some complex SQL> 
SELECT * 
FROM cte foo 
JOIN cte bar ON foo.id = bar.id 
JOIN cte baz ON foo.id = baz.id 
WHERE foo.field = 'foo' 
AND bar.field = 'bar' 
AND baz.field = 'baz' 
संबंधित मुद्दे