বর্তমান পোস্টগ্রেস 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');
পূর্ববর্তী প্রশ্ন থেকে একটি এসকিউএল ফিডলও রয়েছে ।
আমি রেফারেন্সড প্রশ্নের উদ্দেশ্য অর্জনের জন্য SELECT
একটি লিখেছিলাম wrote FULL JOIN
সরলীকৃত:
SELECT ts, f.foo, b.bar
FROM foo f
FULL JOIN bar b USING (ts);
নির্দিষ্টকরণ অনুসারে, কলামটি সম্বোধনের সঠিক উপায়টি ts
সারণীর যোগ্যতা ছাড়াই। উভয়ই ইনপুট মান ( f.ts
বা b.ts
) নুল হতে পারে। 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.
আমি জানি আমি বিভিন্ন নাম বা সাবকিউরি ব্যবহার করতে পারি বা অন্য কোনও ফাংশন ব্যবহার করতে পারি। তবে আমি আশ্চর্য হই যে কলামটি উল্লেখ করার কোনও উপায় আছে কিনা। আমি টেবিল-যোগ্যতা ব্যবহার করতে পারি না। কেউ মনে করতে পারে একটি উপায় থাকা উচিত ।
আছে?