वर्तमान Postgres 9.4 में ( इस संबंधित प्रश्न से ) इस सेटअप को देखते हुए :
CREATE TABLE foo (ts, foo) AS
VALUES (1, 'A') -- int, text
, (7, 'B');
CREATE TABLE bar (ts, bar) AS
VALUES (3, 'C')
, (5, 'D')
, (9, 'E');
पिछले प्रश्न से एक SQL फिडेल भी है ।
मैंने संदर्भित प्रश्न के उद्देश्य को प्राप्त करने के लिए एक के SELECT
साथ लिखा था FULL JOIN
। सरलीकृत:
SELECT ts, f.foo, b.bar
FROM foo f
FULL JOIN bar b USING (ts);
विनिर्देशों के अनुसार, स्तंभ को संबोधित करने का सही तरीका ts
टेबल योग्यता के बिना है। या तो इनपुट मान ( f.ts
या b.ts
) NULL हो सकते हैं। USING
खंड एक अजीब मामला का एक सा बनाता है: एक "इनपुट" स्तंभ है कि वास्तव में इनपुट में उपस्थित नहीं है शुरू। अब तक बहुत खूबसूरत।
मैंने इसे एक plpgsql फ़ंक्शन में रखा। सुविधा (या आवश्यकताओं) के लिए मुझे टेबल फ़ंक्शन के परिणाम के लिए समान कॉलम नाम चाहिए। इसलिए हमें समान कॉलम नामों और फ़ंक्शन मापदंडों के बीच नामकरण संघर्ष से बचना होगा। अलग-अलग नामों को लेने से हमें बचना चाहिए, लेकिन यहां हम हैं:
CREATE OR REPLACE FUNCTION f_merge_foobar()
RETURNS TABLE(ts int, foo text, bar text) AS
$func$
BEGIN
FOR ts, foo, bar IN
SELECT COALESCE(f.ts, b.ts), f.foo, b.bar
FROM foo f
FULL JOIN bar b USING (ts)
LOOP
-- so something
RETURN NEXT;
END LOOP;
END
$func$ LANGUAGE plpgsql;
समस्या पर प्रकाश डालने के लिए साहसिक जोर । मैं पहले की तरह टेबल योग्यता के बिना उपयोग नहीं कर सकता , क्योंकि plpgsql एक अपवाद को बढ़ाएगा (सख्ती से आवश्यक नहीं है, लेकिन शायद ज्यादातर मामलों में उपयोगी है):ts
ERROR: column reference "ts" is ambiguous LINE 1: SELECT ts, f.foo, b.bar ^ DETAIL: It could refer to either a PL/pgSQL variable or a table column.
मुझे पता है कि मैं अलग-अलग नामों या एक उपश्रेणी का उपयोग कर सकता हूं या किसी अन्य फ़ंक्शन का उपयोग कर सकता हूं। लेकिन मुझे आश्चर्य है कि अगर कॉलम को संदर्भित करने का कोई तरीका है। मैं टेबल-योग्यता का उपयोग नहीं कर सकता। कोई सोचता होगा कि कोई रास्ता होना चाहिए ।
है?