我有一个带有三个表的数据库,其中一个是包含对其他两个表的外键引用的联结表。我无法理解如何根据匹配其他两个表中存在的行来对联结表创建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
表格中执行插入操作:< / 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声明,但是我不允许发布它(当我尝试将此问题包含在此问题中时,我收到了一个通用的“发生问题”消息)
答案 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 = ?;