2017-01-07 28 views
1

我想打電話給其在特定的課程,但它返回的錯誤模塊:這個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

回答

1

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表添加約束。

0

這是一個簡單的SQL語法錯誤。您正在使用

WHERE mod_id = 

但是,您可能有多個從子查詢返回的行。用戶IN:

WHERE mod_id IN 
+0

這不是語法錯誤,而是一個邏輯錯誤 – Rahul

相關問題