Tại sao có sự khác biệt về hành vi giữa việc sử dụng Hàm Đặt lại (SRF) trong danh sách CHỌN so với sử dụng SRF trong mệnh đề TỪ?
Ví dụ: đối với SRF đơn giản trả về 2 hàng:
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();
trả về hai hàng cột đơn mỗi hàng chứa một bản ghi:
=> gen_series
------------
(1,1)
(2,2)
(2 rows)
Trong khi đó SELECT * FROM gen_series();
trả về hai hàng với bản ghi được mở rộng:
=> column1 | column2
---------+---------
1 | 1
2 | 2
(2 rows)
Khi so sánh, nếu SRF trả về một cột đơn, thì việc gọi SRF trong mệnh đề CHỌN hoặc TỪ không có sự khác biệt. ví dụ:
=> SELECT generate_series(1,2);
generate_series
-----------------
1
2
(2 rows)
=> SELECT * FROM generate_series(1,2);
generate_series
-----------------
1
2
(2 rows)
Câu hỏi của tôi là:
Tôi không hiểu tại sao trong trường hợp thứ hai, hành vi SRF khác với trường hợp đầu tiên chỉ vì bảng được trả về có một cột duy nhất. Đây có phải là hành vi thực sự phù hợp về các loại, bộ và bộ?
Sự khác biệt giữa hai trường hợp dẫn đến hành vi khác nhau là gì?
SRF có thể được sử dụng như các bảng như hình trên, nhưng các bảng có thể được sử dụng để thay thế SRF không? ví dụ
SELECT my_table;
Rõ ràng, điều này không thể được thực hiện, nhưng tại sao SELECT my_SRF();
có thể, trong khi
SELECT my_table;
không được phép (về mặt quan hệ và toán học)?
SELECT my_table;
không phải là một cú pháp hợp lệ