Dada esta configuración en Postgres 9.4 actual ( de esta pregunta relacionada ):
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');
También hay un SQL Fiddle de la pregunta anterior.
Escribí un SELECT
con un FULL JOIN
para lograr el objetivo de la pregunta referenciada. Simplificado:
SELECT ts, f.foo, b.bar
FROM foo f
FULL JOIN bar b USING (ts);
Según las especificaciones, la forma correcta de abordar la columna ts
es sin calificación de tabla. Cualquiera de los valores de entrada ( f.ts
o b.ts
) puede ser NULL. La USING
cláusula crea un caso extraño: presenta una columna de "entrada" que en realidad no está presente en la entrada. Hasta ahora muy elegante.
Puse esto en una función plpgsql. Por conveniencia (o requisitos) quiero los mismos nombres de columna para el resultado de la función de tabla. Por lo tanto, debemos evitar conflictos de nombres entre nombres de columna idénticos y parámetros de función. Debería evitarse eligiendo diferentes nombres, pero aquí estamos:
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;
Negrita énfasis para resaltar el problema . No puedo usar sin calificación de tabla como antes, porque plpgsql generaría una excepción (no estrictamente necesario, pero probablemente útil en la mayoría de los casos):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.
Sé que puedo usar diferentes nombres o una subconsulta o usar otra función. Pero me pregunto si hay una manera de hacer referencia a la columna. No puedo usar la calificación de tabla. Uno pensaría que debería haber un camino.
¿Esta ahí?
fuente