2017-01-07 6 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

'course_id 선택, 코스 (*) 코스 모듈로부터 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