如何在PostgreSQL中利用两张表的数据在临时表展示平均分
解决方案
首先先修正你的表结构冗余问题:Grades表不需要重复存储学生的name和email,应该用student_id关联Students表的id字段作为外键,这样数据更规范,避免冗余。
接下来我们通过关联两张表计算学生平均分,并将结果存入临时表,以下是完整实现代码:
完整代码示例
const { Client } = require('pg'); const client = new Client({ host: 'localhost', user: 'postgres', database: 'xxx', password: 'xxx', port: xxx, }); async function run() { try { await client.connect(); // 创建Students表(添加主键约束,避免重复建表报错) const createStudents = ` CREATE TABLE IF NOT EXISTS students ( id uuid PRIMARY KEY, name varchar NOT NULL, email varchar UNIQUE NOT NULL, age int ); `; await client.query(createStudents); console.log("Students表创建成功"); // 创建Grades表(用student_id关联学生表,添加外键约束保证数据一致性) const createGrades = ` CREATE TABLE IF NOT EXISTS grades ( id uuid PRIMARY KEY, student_id uuid REFERENCES students(id) NOT NULL, class varchar NOT NULL, grade int NOT NULL CHECK (grade >= 0 AND grade <= 100) ); `; await client.query(createGrades); console.log("Grades表创建成功"); // 创建临时表并写入学生平均分数据 const createTempAvgTable = ` CREATE TEMP TABLE student_avg_grades AS SELECT s.id AS student_id, s.name, ROUND(AVG(g.grade), 2) AS average_grade FROM students s INNER JOIN grades g ON s.id = g.student_id GROUP BY s.id, s.name; `; await client.query(createTempAvgTable); console.log("临时表student_avg_grades创建完成,已存入平均分数据"); // 可选:查询临时表验证结果 const avgResult = await client.query('SELECT * FROM student_avg_grades'); console.log("学生平均分详情:", avgResult.rows); } catch (err) { console.error("执行出错:", err); } finally { await client.end(); } } run();
关键说明
- 用
CREATE TABLE IF NOT EXISTS避免重复建表时抛出错误 - Grades表通过
student_id关联Students表主键,添加外键约束防止出现不存在的学生ID数据 - 临时表使用
CREATE TEMP TABLE ... AS语法,直接将查询结果写入,临时表会在数据库会话结束后自动销毁 - 用
AVG(g.grade)计算平均分,配合ROUND保留两位小数,GROUP BY按学生ID和姓名分组(ID为唯一标识) - 改用async/await写法替代回调,逻辑更清晰,避免回调嵌套问题
内容的提问来源于stack exchange,提问作者Itsokaro924
相关产品推荐
相关产品推荐

