เมื่อกำหนดสองตารางที่มีจำนวนแถวที่ไม่ได้กำหนดด้วยชื่อและค่าฉันจะแสดงCROSS JOIN
ฟังก์ชันที่มีเครื่องหมายทับค่าของพวกมันได้อย่างไร
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);
ตัวอย่างเช่นถ้าฟังก์ชันนั้นเป็นการคูณฉันจะสร้างตาราง (การคูณ) เช่นเดียวกับด้านล่างได้อย่างไร
(arg1,arg2,result)
แถวเหล่านั้นทั้งหมดสามารถสร้างขึ้นได้ด้วย
SELECT foo.name AS arg1, bar.name AS arg2, foo.x*bar.x AS result
FROM foo
CROSS JOIN bar;
ดังนั้นนี่เป็นเพียงคำถามของงานนำเสนอฉันต้องการสิ่งนี้เพื่อทำงานกับชื่อที่กำหนดเอง - ชื่อที่ไม่ได้เป็นเพียงอาร์กิวเมนต์CAST
ที่เขียนเป็นข้อความ แต่ตั้งอยู่ในตาราง
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);
ฉันคิดว่าสิ่งนี้จะทำได้อย่างง่ายดายด้วย CROSSTAB ที่มีความสามารถในการส่งคืนแบบไดนามิก
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**
แต่ถ้าไม่มี**MAGIC**
ฉันก็จะได้
ERROR: a column definition list is required for functions returning "record" LINE 1: SELECT * FROM crosstab(
สำหรับการอ้างอิงโดยใช้ตัวอย่างข้างต้นที่มีชื่อนี้เป็นสิ่งที่มากขึ้นเช่นสิ่งที่tablefunc
's crosstab()
ความต้องการ
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);
แต่ตอนนี้เรากลับไปตั้งสมมติฐานเกี่ยวกับเนื้อหาและขนาดของbar
ตารางในตัวอย่างของเรา ดังนั้นถ้า
- ตารางมีความยาวไม่ได้กำหนด
- จากนั้น cross-join จะแสดงถึงมิติที่ไม่ได้กำหนด (เนื่องจากด้านบน)
- catagory-names (parlance cross-tab) อยู่ในตาราง
อะไรคือสิ่งที่ดีที่สุดที่เราสามารถทำได้ใน PostgreSQL โดยไม่มี "รายการนิยามคอลัมน์" เพื่อสร้างงานนำเสนอแบบนั้น