Đưa ra hai bảng có số lượng hàng không xác định với tên và giá trị, làm thế nào tôi sẽ hiển thị một trục CROSS JOIN
của hàm trên các giá trị của chúng.
CREATE TEMP TABLE foo AS
SELECT x::text AS name, x::int
FROM generate_series(1,10) AS t(x);
CREATE TEMP TABLE bar AS
SELECT x::text AS name, x::int
FROM generate_series(1,5) AS t(x);
Ví dụ: nếu hàm đó là phép nhân, làm thế nào tôi có thể tạo bảng (phép nhân) như bảng dưới đây,
Tất cả các (arg1,arg2,result)
hàng đó có thể được tạo bằng
SELECT foo.name AS arg1, bar.name AS arg2, foo.x*bar.x AS result
FROM foo
CROSS JOIN bar;
Vì vậy, đây chỉ là một câu hỏi về cách trình bày, tôi muốn nó cũng hoạt động với một tên tùy chỉnh - một tên không chỉ đơn giản là đối số CAST
ed thành văn bản mà được đặt trong bảng,
CREATE TEMP TABLE foo AS
SELECT chr(x+64) AS name, x::int
FROM generate_series(1,10) AS t(x);
CREATE TEMP TABLE bar AS
SELECT chr(x+72) AS name, x::int
FROM generate_series(1,5) AS t(x);
Tôi nghĩ rằng điều này sẽ dễ dàng thực hiện được với CROSSTAB có khả năng loại trả về động.
SELECT * FROM crosstab(
'
SELECT foo.x AS arg1, bar.x AS arg2, foo.x*bar.x
FROM foo
CROSS JOIN bar
', 'SELECT DISTINCT name FROM bar'
) AS **MAGIC**
Nhưng, không có **MAGIC**
, tôi nhận được
ERROR: a column definition list is required for functions returning "record" LINE 1: SELECT * FROM crosstab(
Để tham khảo, sử dụng các ví dụ trên với tên, đây là một cái gì đó giống như những gì tablefunc
họ crosstab()
muốn.
SELECT * FROM crosstab(
'
SELECT foo.x AS arg1, bar.x AS arg2, foo.x*bar.x
FROM foo
CROSS JOIN bar
'
) AS t(row int, i int, j int, k int, l int, m int);
Nhưng, bây giờ chúng tôi quay lại đưa ra các giả định về nội dung và kích thước của bar
bảng trong ví dụ của chúng tôi. Vì thế nếu,
- Các bảng có độ dài không xác định,
- Sau đó, liên kết chéo đại diện cho một khối có kích thước không xác định (vì ở trên),
- Các tên catagory (cách nói chéo tab) nằm trong bảng
Điều tốt nhất chúng ta có thể làm trong PostgreSQL mà không có "danh sách định nghĩa cột" để tạo ra loại bản trình bày đó là gì?