2017-01-20 10 views
1

У меня есть БД с тремя таблицами, где одна представляет собой таблицу соединений, содержащую ссылки на внешние ключи для двух других таблиц. У меня возникли проблемы с пониманием, как сделать INSERT заявление в таблице соединения условном на соответствующие строки, существующие в двух других таблиц, следующим образом:SQLite: CASE с EXISTS на INSERT

schoolB_courses:

id INTEGER PRIMARY KEY AUTOINCREMENT, 
course_prefix TEXT, 
course_number INTEGER, 
course_title TEXT, 
course_credits INTEGER, 
course_requisites TEXT, 
course_notes TEXT, 
course_description TEXT, 
course_url TEXT) 

schoolA_courses:

id INTEGER PRIMARY KEY AUTOINCREMENT, 
course_prefix TEXT, 
course_number INTEGER, 
course_title TEXT, 
course_credits INTEGER, 
course_requisites TEXT, 
course_notes TEXT, 
course_description TEXT) 

schoolB_equivalencies:

equivalency_id INTEGER PRIMARY KEY AUTOINCREMENT, 
schoolA_id INTEGER NOT NULL, 
schoolB_id INTEGER NOT NULL, 
is_archived INTEGER NOT NULL, 
FOREIGN KEY (schoolA_id) REFERENCES schoolA_courses (id), 
FOREIGN KEY (schoolB_id) REFERENCES schoolB_courses (id)) 

Учитывая пользовательский ввод для schoolA.course_prefix, schoolA.course_number, schoolB.course_prefix и schoolB.course_number, я понимаю, как выполнить вставку в schoolB_equivalencies таблице:

INSERT INTO schoolB_equivalencies (schoolA_id, schoolB_id, is_archived) 
VALUES ((SELECT id from schoolA_courses WHERE course_number=? AND course_prefix=?), 
(SELECT id from schoolB_courses WHERE course_number=? AND course_prefix=?),0) 

Но как я мог только выполнить это INSERT только, если есть строка в schoolA_courses с подходящим номером и префиксом курса И строка в schoolB_courses с соответствующим номером курса и префиксом (для предотвращения вставок эквивалентности, где либо курс школы, курс школы, либо оба не существуют)?

Я попытался положить вместе саз, но ТАК не позволю мне разместить его (я получаю родовую «возникла проблема» сообщение, когда я пытаюсь включить его в этом вопросе)

ответ

0

Вы могли бы просто выполнить два SELECT отдельно, а затем выполнить INSERT только тогда, когда это необходимо.

Но если вы действительно хотите использовать один оператор, это возможно. INSERT statement имеет две формы: с VALUES, которая вставляет фиксированное количество строк и с помощью SELECT, которые вставляют столько строк, сколько возвращается запросом. Итак, вы должны построить запрос SELECT, который не возвращает строку, если нет соответствующих курсов:

INSERT INTO schoolB_equivalencies (schoolA_id, schoolB_id, is_archived) 
SELECT schoolA_courses.id, 
     schoolB_courses.id, 
     0 
FROM schoolA_courses, 
    schoolB_courses 
WHERE schoolA_courses.course_number = ? 
    AND schoolA_courses.course_prefix = ? 
    AND schoolB_courses.course_number = ? 
    AND schoolB_courses.course_prefix = ?; 
+0

Спасибо! Не знал о другой форме 'SELECT', поскольку я довольно новичок в SQL - я прочитаю об этом. – Marcatectura