这个postgresql查询如何以表的形式返回?
问题描述:
我想打电话给其在特定的课程,但它返回的错误模块:这个postgresql查询如何以表的形式返回?
CREATE OR REPLACE FUNCTION course_modules(_courseID integer)
RETURNS SETOF modules AS
$$
BEGIN
RETURN QUERY SELECT * FROM modules WHERE mod_id =(SELECT module_id from coursemodules WHERE course_id = _courseID);
END
$$
LANGUAGE 'plpgsql';
coursemodule表:由作为表达
查询的子查询返回多行
CREATE TABLE coursemodules(
course_id integer references courses (id) ON DELETE CASCADE,
module_id integer references modules (mod_id) ON DELETE CASCADE
);
模块表
CREATE TABLE modules(
documents text NOT NULL,
mod_id serial primary key,
content text NOT NULL,
title varchar(50) NOT NULL
);
课程表
CREATE TABLE courses(
finishDate Date,
description text NOT NULL,
duration varchar(50) NOT NULL,
startDate Date,
id serial primary key,
courseName varchar(50) NOT NULL
);
答
coursemodule表没有限制,一个课程只能有一个模块。因为SELECT module_id from coursemodules WHERE course_id = _courseID
子查询可能会返回多行。
如果更改mod_id = (SELECT module_id from coursemodules WHERE course_id = _courseID)
到
mod_id IN (SELECT module_id from coursemodules WHERE course_id = _courseID)
。
它应该工作。否则,您必须向coursemodule表添加约束。
答
这是一个简单的SQL语法错误。您正在使用
WHERE mod_id =
但是,您可能有多个从子查询返回的行。用户IN:
WHERE mod_id IN
+0
这不是语法错误,而是一个逻辑错误 – Rahul
如果您运行'SELECT course_id,COUNT(*)FROM coursemodules GROUP BY course_id',您将看到'course_id'重复的行。 – Dai
我注意到'course_id'没有被声明为'coursemodules'表的主键,也没有'UNIQUE'约束。 – Dai