SQLite:在 INSERT 上存在 EXISTS 的 CASE

SQLite: CASE with EXISTS on INSERT

我有一个包含三个 table 的数据库,其中一个是连接点 table,其中包含对另外两个 table 的外键引用。我无法理解如何以匹配其他两个 table 中存在的行为条件对联结点 table 进行 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 table:

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)

但是 如果 schoolA_courses 中有一行具有匹配的课程编号和前缀,以及 schoolB_courses 中具有匹配课程编号和前缀 的一行(以防止在 schoolA 课程、schoolB 课程或两者都不存在的情况下进行等效插入)?

我试过组合一个 CASE 语句,但是不允许我 post 它(当我尝试包含时我收到一条通用的 "problem occurred" 消息它在这个问题中)

您可以简单地分别执行两个 SELECT,然后仅在需要时执行 INSERT。

但是如果你真的想使用单个语句,这是可以的。 INSERT statement 有两种形式:with VALUES,插入固定数量的行,以及 with SELECT,插入与查询返回的行一样多的行。 因此,您必须构造一个 SELECT 查询,如果没有匹配的课程,则 returns 没有行:

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 = ?;