Mevcut Postgres 9.4'te ( bu ilgili sorudan ) bu kurulum göz önüne alındığında :
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');
Önceki sorudan bir SQL Fiddle da var .
A SELECT
ile FULL JOIN
yazılan sorunun amacına ulaşmak için bir ile yazdım . Basitleştirilmiş:
SELECT ts, f.foo, b.bar
FROM foo f
FULL JOIN bar b USING (ts);
Spesifikasyonlara göre, sütuna hitap etmenin doğru yolu ts
tablo niteliksizdir. Giriş değerlerinden ( f.ts
veya b.ts
) her ikisi de NULL olabilir. USING
Fıkra garip bir durum biraz oluşturur: aslında giriş mevcut değil bir "giriş" sütunu tanıtan. Şimdiye kadar çok zarif.
Bunu bir plpgsql işlevine koydum. Kolaylık (veya gereksinimler) için tablo işlevinin sonucu için aynı sütun adlarını istiyorum. Bu nedenle, aynı sütun adları ile işlev parametreleri arasındaki adlandırma çakışmalarını önlemek zorundayız. Farklı isimler seçerek kaçınılmalıdır, ama işte buradayız:
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;
Sorunu vurgulamak için cesur vurgu . Daha önce olduğu gibi tablo yeterlilik olmadan kullanamam , çünkü plpgsql bir istisna (kesinlikle gerekli değildir, ancak muhtemelen çoğu durumda yararlıdır) yükseltir: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.
Farklı isimler veya alt sorgular ya da başka bir fonksiyon kullanabileceğimi biliyorum. Ancak, sütuna başvurmanın bir yolu olup olmadığını merak ediyorum. Tablo kalifikasyonunu kullanamıyorum. Kişi bir yol olması gerektiğini düşünürdü .
Var mı?