¿Por qué hay una diferencia en el comportamiento entre usar una Función de retorno de conjunto (SRF) en la lista SELECCIONAR versus usar SRF en la cláusula FROM?
Por ejemplo, para un SRF simple que devuelve 2 filas:
CREATE OR REPLACE FUNCTION gen_series(out integer, out int)
RETURNS SETOF record AS $$
SELECT 1,1
UNION
SELECT 2,2;
$$ LANGUAGE SQL;
SELECT gen_series();
devuelve dos filas de columnas individuales, cada una con un registro:
=> gen_series
------------
(1,1)
(2,2)
(2 rows)
Mientras que SELECT * FROM gen_series();
devuelve dos filas con el registro expandido:
=> column1 | column2
---------+---------
1 | 1
2 | 2
(2 rows)
En comparación, si el SRF está devolviendo una sola columna, entonces llamar al SRF en la cláusula SELECT o FROM no hace ninguna diferencia. p.ej:
=> SELECT generate_series(1,2);
generate_series
-----------------
1
2
(2 rows)
=> SELECT * FROM generate_series(1,2);
generate_series
-----------------
1
2
(2 rows)
Mis preguntas son:
No entiendo por qué en el segundo caso, el comportamiento de SRF es diferente del primer caso solo porque la tabla devuelta tiene una sola columna. ¿Es este comportamiento realmente consistente en términos de tipos, tuplas y conjuntos?
¿Cuál es la diferencia entre los dos casos que conduce a un comportamiento diferente?
SRF se puede usar como tablas como se muestra arriba, pero ¿se pueden usar tablas para reemplazar los SRF también? p.ej
SELECT my_table;
Aparentemente, esto no se puede hacer, pero ¿por qué es SELECT my_SRF();
posible, mientras
SELECT my_table;
que no está permitido (en términos de relaciones y matemáticas)?
SELECT my_table;
no es una sintaxis válida