Враховуючи цю установку в поточному 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 Fiddle з попереднього питання.
Я написав 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.
Я знаю, що я можу використовувати різні імена, підзапит або використовувати іншу функцію. Але мені цікаво, чи є спосіб посилатися на колонку. Я не можу використовувати табличну кваліфікацію. Можна було б подумати, що має бути спосіб.
Є там?