Angesichts dieses Setups in aktuellem Postgres 9.4 ( aus dieser verwandten Frage ):
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');
Es gibt auch eine SQL-Geige aus der vorherigen Frage.
Ich habe ein SELECT
mit a geschrieben FULL JOIN
, um das Ziel der genannten Frage zu erreichen. Vereinfacht:
SELECT ts, f.foo, b.bar
FROM foo f
FULL JOIN bar b USING (ts);
Die korrekte Adressierung der Spalte ts
erfolgt gemäß Spezifikation ohne Tabellenqualifizierung. Jeder der Eingabewerte ( f.ts
oder b.ts
) kann NULL sein. Die USING
Klausel erzeugt einen seltsamen Fall: Eine "Eingabe" -Spalte wird eingefügt, die in der Eingabe nicht vorhanden ist. So weit so elegant.
Ich habe dies in eine plpgsql-Funktion eingefügt. Der Einfachheit halber (oder den Anforderungen halber) möchte ich die gleichen Spaltennamen für das Ergebnis der Tabellenfunktion. Wir müssen also Namenskonflikte zwischen identischen Spaltennamen und Funktionsparametern vermeiden. Sollte am besten vermieden werden, indem man verschiedene Namen auswählt, aber hier sind wir:
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;
Fettdruck, um das Problem hervorzuheben . Ohne Tabellenqualifizierung kann ich nicht wie zuvor verwenden, da plpgsql eine Ausnahme auslösen würde (nicht unbedingt erforderlich, aber wahrscheinlich in den meisten Fällen nützlich):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.
Ich weiß, dass ich verschiedene Namen oder eine Unterabfrage verwenden oder eine andere Funktion verwenden kann. Aber ich frage mich, ob es eine Möglichkeit gibt, die Spalte zu referenzieren. Ich kann keine Tabellenqualifikation verwenden. Man würde denken, es sollte einen Weg geben.
Gibt es?