这个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 
); 
+0

如果您运行'SELECT course_id,COUNT(*)FROM coursemodules GROUP BY course_id',您将看到'course_id'重复的行。 – Dai

+0

我注意到'course_id'没有被声明为'coursemodules'表的主键,也没有'UNIQUE'约束。 – Dai

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