У меня есть 4 таблицы:SQLite - Выбор записи, которые не имеют аналогов в другой таблице
CREATE TABLE People(
id integer primary key autoincrement,
'First Name' text,
'Last Name' text,
);
CREATE TABLE Courses(
id integer primary key autoincrement,
'Course Name' text,
'Course Refresh Rate' integer
);
CREATE TABLE [Course Enrolment](
'Person ID' integer,
'Course ID' integer,
FOREIGN KEY ('Person ID') REFERENCES People(id),
FOREIGN KEY ('Course ID') REFERENCES Courses(id)
);
CREATE TABLE [Course Participation](
'Person ID' integer,
'Course ID' integer,
'Date Taken' text,
FOREIGN KEY ('Person ID') REFERENCES People(id),
FOREIGN KEY ('Course ID') REFERENCES Courses(id)
);
Я пытаюсь выбрать людей, которые зачислены на курс, но либо никогда не взяли курс (и поэтому не имеют записи в таблице «Участие в курсе») или прошли курс больше, чем «Частота обновления курса» несколько лет назад. Я написал инструкцию select, но она не работает должным образом.
SELECT [First Name],
[Last Name]
FROM people AS p
LEFT JOIN courses AS c
JOIN [course enrolment] AS ce
JOIN [course participation] AS cp
ON p.id = ce.[Person ID]
AND p.id = cp.[Person ID]
AND c.id = ce.[Course ID]
AND c.id = cp.[Course ID]
WHERE EXISTS(SELECT * FROM [Course Enrolment] as ce_2 WHERE ce_2.[Person ID] = p.id and ce_2.[Course ID] = c.id)
AND ([date taken] < date('now', '-' || [course refresh rate] || ' year')
or NOT EXISTS(SELECT * FROM [Course Participation] WHERE cp.[Person ID] = p.id and cp.[Course ID] = c.id))
;
Что я сделал не так?
что это такое = 0? – Himanshu
Непонимание инструкции Exists, я заменил ее тем, что, по моему мнению, является правильным синтаксисом. – Sam
Я думаю, проблема может заключаться в том, что с вашей конструкцией 'JOIN ... ON ...' вы создаете таблицу, в которой ** ** есть только люди, у которых есть запись в ** каждой ** ваших таблиц. Попробуйте отказаться от инструкции ON в целом и затем выберите уникальные результаты. –