2017-01-20 7 views
1

私は3つのテーブルを持つDBを持っています.1つは、他の2つのテーブルへの外部キー参照を含むジャンクションテーブルです。SQLite:INSERTでEXISTSを使用するケース

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) 
を次のように私は、他の2つの表に既存の行に一致することを条件ジャンクションテーブルに INSERT文を作成する方法を理解するトラブルを抱えています

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_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の行と一致するコース番号と接頭辞、AND schoolB_coursesの行と一致するコース番号と接頭辞(学校Aコース、学校Bコース、またはその両方が存在しない場合の等価性の挿入を防止する)?

私は一緒にCASE文を入れて試してみたが、SO私はそれを投稿することができません(私はこの質問に含めるしようとすると、一般的なメッセージを「問題が発生しました」取得)

答えて

0

2つのSELECTを別々に実行し、必要なときにのみINSERTを実行することができます。

本当に1つのステートメントを使用したい場合は、これが可能です。 INSERT statementには、固定数の行を挿入するVALUESと、問合せによって戻される行数を挿入するSELECTの2つの形式があります。 一致するコースがない場合、行を返さない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

ありがとうございました!私はSQLにかなり新しいので、 'SELECT'の他の形式を意識していませんでした - 私はそれを読み上げます。 – Marcatectura

関連する問題