2008-10-16 19 views
9

में त्रुटि देखें मेरे पास PostgreSQL डेटाबेस में एक बड़ी क्वेरी है।PostgreSQL

SELECT * FROM table1, table2, ... WHERE table1.id = table2.id... 

जब मैं एक एसक्यूएल क्वेरी के रूप में इस क्वेरी चलाने के लिए, यह वांछित पंक्ति रिटर्न: क्वेरी कुछ इस तरह है।

लेकिन जब मैं एक ही क्वेरी का उपयोग करने के लिए एक दृश्य बनाने के लिए कोशिश करता है, यह एक त्रुटि देता है:

"त्रुटि: स्तंभ" "। बार उल्लेख किया गया" आईडी

(मैं pgAdminIII का उपयोग करते प्रश्नों को क्रियान्वित।)

मुझे लगता है कि करेंगे ऐसा होता है क्योंकि resultset एक से अधिक स्तंभ "आईडी" नाम दिया होगा। क्या क्वेरी में सभी कॉलम नाम लिखने के बिना इसे हल करने के लिए कोई रास्ता है?

उत्तर

11

ऐसा इसलिए होता है क्योंकि दृश्य में दो आईडी नामक कॉलम होते हैं, तालिका 1 में से एक और तालिका 2 से एक, चयन * के कारण होता है।

आपको यह निर्दिष्ट करने की आवश्यकता है कि आप कौन सी आईडी को देखना चाहते हैं।

SELECT table1.id, column2, column3, ... FROM table1, table2 
WHERE table1.id = table2.id 

क्वेरी काम करता है क्योंकि यह समान रूप से कॉलम नाम दिया जा सकता है ... भाषा में

postgres=# select 1 as a, 2 as a; 
a | a 
---+--- 
1 | 2 
(1 row) 

postgres=# create view foobar as select 1 as a, 2 as a; 
ERROR: column "a" duplicated 
postgres=# create view foobar as select 1 as a, 2 as b; 
CREATE VIEW 
+3

क्या SELECT * क्वेरी के परिणामस्वरूप तालिका नाम स्वचालित रूप से कॉलम नामों को पूर्ववत करने का कोई तरीका है? – nnyby

-2

कोई अंतर्निहित जिस तरह से यह (हल और स्पष्ट रूप से करने के लिए, * क्योंकि सामान्य रूप में एक बुरी बात है यह टेबल स्कीमा के रूप में उत्पन्न होने के लिए गुप्त दोष उत्पन्न कर सकता है - आप table1 कर सकते हैं। *, table2.acolumn, tabl2.bcolumn अगर आप सभी एक टेबल और चुनिंदा रूप से दूसरे से चाहते हैं), लेकिन यदि PostgreSQL INFORMATION_SCHEMA का समर्थन करता है, तो आप कुछ कर सकते हैं जैसे:

DECLARE @sql AS varchar 

SELECT @sql = COALESCE(@sql + ', ', '') 
    + '[' + TABLE_NAME + '].[' + COLUMN_NAME + ']' 
    + CHAR(13) + CHAR(10) 
FROM INFORMATION_SCHEMA.COLUMNS 
WHERE TABLE_NAME IN ('table1', 'table2') 
ORDER BY TABLE_NAME, ORDINAL_POSITION 

PRINT @sql 

और बहुत सारे टाइपिंग को बचाने के लिए परिणामों को पेस्ट करें। आपको उन स्तंभों को मैन्युअल रूप से उपनाम करने की आवश्यकता होगी जिनके पास समान नाम है। तुम भी कोड पीढ़ी अद्वितीय नामों यदि आप चाहें तो कर सकते हैं (लेकिन मुझे नहीं पता):

SELECT @sql = COALESCE(@sql + ', ', '') 
    + '[' + TABLE_NAME + '].[' + COLUMN_NAME + '] ' 
    + 'AS [' + TABLE_NAME + '_' + COLUMN_NAME + ']' 
    + CHAR(13) + CHAR(10) 
FROM INFORMATION_SCHEMA.COLUMNS 
WHERE TABLE_NAME IN ('table1', 'table2') 
ORDER BY TABLE_NAME, ORDINAL_POSITION 
+0

पोस्टग्रेएसक्यूएल में @ सोमेथिंग जैसी कुछ भी नहीं है। –

+0

पहचानकर्ताओं को उद्धृत करने के लिए [] का उपयोग भी नहीं कर रहा है। और CHAR() फ़ंक्शन नहीं। और कोई प्रिंट स्टेटमेंट नहीं। –

11

अगर केवल में शामिल होने के स्तंभों को दोहराया गया है (यानी एक ही नाम है), तो आप को बदलने के साथ भाग प्राप्त कर सकते हैं:

select * 
from a, b 
where a.id = b.id 

रहे हैं:

select * 
from a join b using (id) 
+0

यह त्रुटि को ठीक नहीं करता है, लेकिन यह वैसे भी एक अच्छा वाक्यविन्यास है। –

0

तुम यहाँ मिला है क्योंकि आप to_date की तरह एक समारोह का उपयोग करने के लिए "एक बार से अधिक परिभाषित" त्रुटि हो रही है की कोशिश कर रहा है और कर रहे हैं, ध्यान दें कि आप कार्यों के लिए एक कॉलम अन्य नाम का उपयोग करने की आवश्यकता है , उदाहरण:

to_date(o.publication_date, 'DD/MM/YYYY') AS publication_date