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_prefix
、schoolA.course_number
、schoolB.course_prefix
和 schoolB.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 = ?;
我有一个包含三个 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_prefix
、schoolA.course_number
、schoolB.course_prefix
和 schoolB.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 = ?;