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

Если вы запустите '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