SQLite:在INSERT上使用EXISTS的CASE

时间:2017-01-20 22:28:02

标签: sqlite foreign-keys 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_prefixschoolA.course_numberschoolB.course_prefixschoolB.course_number的用户输入,我了解如何在schoolB_equivalencies表格中执行插入操作:< / p>

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 {1}}具有匹配的课程编号和前缀(以防止在schoolA课程,schoolB课程或两者都不存在的情况下等效插入)?

我已尝试整理CASE声明,但是我不允许发布它(当我尝试将此问题包含在此问题中时,我收到了一个通用的“发生问题”消息)

1 个答案:

答案 0 :(得分: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 = ?;