2012-09-01 21 views
6

क्या कोई सेटिंग या विधि है जिसका उपयोग मैं ओरेकल को <table>.<column> प्रारूप में परिणाम लौटने के लिए उपयोग कर सकता हूं? उदाहरण के लिए:table.column प्रारूप में ओरेकल स्तंभ नाम लौटें?

क्वेरी:

SELECT  * 
FROM  foo f 
INNER JOIN bar b 
ON   b.foo_id = f.id 

वांछित परिणाम:

F.ID F.BLAH B.ID B.FOO_ID B.BLAH 
-------------------------------------------------------- 
1  blah 7  1   blah 
2  blah 8  2   blah 
3  blah 9  2   blah 

स्पष्ट समाधान को व्यक्तिगत रूप से प्रत्येक स्तंभ SELECT f.id AS F_ID, ... उर्फ ​​करने के लिए है, हालांकि, मुझे कुछ बहुत बड़ी विरासत तालिकाओं (300+ कॉलम) निर्यात करने की आवश्यकता है, इसलिए इस विधि का उपयोग करने से प्रश्न भारी और अव्यवहारिक हो जाएंगे।

+0

मैं PL/SQL में सक्षम नहीं है, लेकिन शायद आप उन्हें शामिल होने से पहले टेबल के स्तंभ का नाम बदलने की कोशिश कर सकते हैं। – bonsvr

+0

आप डेटा का निर्यात कैसे कर रहे हैं? हो सकता है कि यह तर्क व्यक्तिगत विवरणों के बजाय उस निर्यात उपकरण में संबंधित है? –

उत्तर

8

ऐसा करने के लिए कोई "विकल्प" Oracle में है; आप एक ग्राहक को खोजने में सक्षम हो जो आपको ऐसा करने की अनुमति देता है क्योंकि यह एक ऐसा काम है जो आमतौर पर ग्राहक में किया जाएगा; मैं एक के बारे में नहीं जानता।

tbone's answer आप इस गतिशील रूप से करने के लिए करने जा रहे हैं पर विस्तार करने के लिए। यह का अर्थ यह नहीं है कि आपको प्रत्येक कॉलम सूचीबद्ध करना होगा। आप अपनी क्वेरी बनाने के लिए data dictionary, विशेष रूप से all_tab_columns या user_tab_columns का उपयोग करेंगे। अपनी इच्छित परिभाषा के साथ एक दृश्य बनाना आसान होगा ताकि आप चाहें तो इसका पुन: उपयोग कर सकें।

उद्देश्य तथ्य यह है कि कॉलम अस्तित्व आदेश उस कॉलम का उपयोग करने के लिए एक प्रश्न बनाने के लिए एक स्ट्रिंग के रूप में एक तालिका में संग्रहीत किया जाता है का उपयोग करें। चूंकि स्तंभ नाम और तालिका नाम तारों के रूप में संग्रहीत होते हैं, इसलिए आप स्ट्रिंग एग्रीगेशन तकनीकों का उपयोग आसानी से एक क्वेरी या डीडीएल कथन बनाने के लिए कर सकते हैं जिसे आप मैन्युअल रूप से या गतिशील रूप से निष्पादित कर सकते हैं।

आप ओरेकल 11g रिलीज उपयोग कर रहे हैं 2 listagg समारोह उपलब्ध है मदद करने के लिए:

:

create table foo (id number, a number, b number, c number); 
create table bar (foo_id number, a number, b number, c number); 

यह एकल क्वेरी निम्नलिखित का उत्पादन:

select 'create or replace view my_view as 
     select ' 
     || listagg(table_name || '.' || column_name 
       || ' as ' 
       || substr(table_name,1,1) || '_' 
       || column_name, ', ') 
     within group 
     (order by case when table_name = 'FOO' then 0 else 1 end 
        , column_id 
     ) 
     || ' from foo f 
      join bar b 
       on f.id = b.foo_id' 
    from user_tab_columns 
where table_name in ('FOO','BAR') 
     ; 

इस तालिका संरचना मान लिया जाये

create or replace view my_view as 
select FOO.ID as F_ID, FOO.A as F_A, FOO.B as F_B, FOO.C as F_C 
     , BAR.FOO_ID as B_FOO_ID, BAR.A as B_A, BAR.B as B_B, BAR.C as B_C 
    from foo f 
    join bar b on f.id = b.foo_id 

और यहाँ एक SQL Fiddle यह साबित करने के है।

आप 11.2 का उपयोग नहीं कर रहे हैं, तो आप अनमोल किए गए फ़ंक्शन wm_concat या उपयोगकर्ता द्वारा परिभाषित फ़ंक्शन stragg का उपयोग करके ठीक उसी परिणाम प्राप्त कर सकते हैं, जिसे टॉम क्येट द्वारा बनाया गया था। ओरेकल बेस पर string aggregation techniques पर एक लेख है और स्टैक ओवरफ़्लो पर कई पोस्ट हैं।

आप वास्तव में वास्तव में बना सकते हैं एक छोटे से परिशिष्ट आप ऊपर क्वेरी में कुछ बदलाव करने के साथ जो खोज रहे हैं के रूप में। TABLE_NAME.COLUMN_NAME प्रारूप में कॉलम बनाने के लिए आप quoted identifier का उपयोग कर सकते हैं।में है जो इसे . के रूप में उद्धृत करने के लिए ओरेकल में किसी ऑब्जेक्ट नाम के लिए मान्य वर्ण नहीं है। इसका लाभ यह है कि आप वही हासिल करते हैं जो आप चाहते हैं। नकारात्मकता यह है कि यदि आप select * from ... का उपयोग नहीं करते हैं तो निर्मित दृश्य से पूछताछ करना एक बड़ा दर्द है; नामित कॉलम का चयन को उद्धृत करने के लिए की आवश्यकता होगी।

select 'create or replace view my_view as 
     select ' 
     || listagg(table_name || '.' || column_name 
       || ' as ' 
       || '"' || table_name || '.' 
       || column_name || '"', ', ') 
     within group 
     (order by case when table_name = 'FOO' then 0 else 1 end 
        , column_id 
     ) 
     || ' from foo f 
      join bar b 
       on f.id = b.foo_id' 
    from user_tab_columns 
where table_name in ('FOO','BAR') 
     ; 

This query returns:

create or replace view my_view as 
select FOO.ID as "FOO.ID", FOO.A as "FOO.A", FOO.B as "FOO.B", FOO.C as "FOO.C" 
     , BAR.FOO_ID as "BAR.FOO_ID", BAR.A as "BAR.A" 
     , BAR.B as "BAR.B", BAR.C as "BAR.C" 
    from foo f 
    join bar b on f.id = b.foo_id 
3

का उपयोग उपनाम प्रश्नों अव्यावहारिक हो जाते हैं, इसकी सिर्फ लगभग के रूप में टाइपिंग के रूप में सुविधाजनक नहीं * नहीं होगा। आप के लिए कॉलम उत्पन्न करने के लिए गतिशील एसक्यूएल का उपयोग करें:

select 'f.' || column_name || ' as F_' || column_name || ',' 
from all_tab_columns 
where table_name = 'FOO' 
order by column_id; 

किसी अन्य विस्तृत तालिकाओं आप की जरूरत के लिए एक ही करते हैं, और कॉपी/आपकी क्वेरी में पेस्ट करें। 30 char सीमा को भी ध्यान दें, उम्मीद है कि आपके कॉलम में से कोई भी आकार 28 से अधिक नहीं है।

+0

सुझाव के लिए धन्यवाद, लेकिन मैं विशेष रूप से ऐसे समाधान के लिए पूछ रहा था जिसमें कॉलम को स्पष्ट रूप से सूचीबद्ध नहीं किया गया है। – FtDRbwLXw6

संबंधित मुद्दे