这个postgresql查询如何作为表返回?

时间:2017-01-07 11:48:09

标签: sql postgresql stored-functions

我试图在特定过程中调用模块,但它返回错误:用作表达式的子查询返回的多行

查询:

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';

课程表

 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
 );

2 个答案:

答案 0 :(得分:1)

课程表中没有限制课程只能有一个模块。因此,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表添加约束。

答案 1 :(得分:0)

这是一个简单的SQL语法错误。您正在使用

WHERE mod_id =

但是您可能从子查询返回多行。用户IN:

WHERE mod_id IN