2013-08-16 1 views
1

에 상대가없는 레코드 선택 나는 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) 
); 

나는 코스 등록되어있는 사람을 선택하는 것을 시도하고있다,하지만 어느 과정을 (촬영 적이 없다 그러므로 Course Participation 테이블에 기록이 없거나) 수년 전에 'Course Refresh Rate'보다 더 많이 수강 한 것입니다. 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

테스트 완료 = 0 있다는 것입니다하지? – Himanshu

+0

Exists 문에 대한 오해로 올바른 구문이라고 생각하는 것으로 바꾸 었습니다. – Sam

+0

나는 당신의'JOIN ... ON ... '구조로 ** 테이블 **을 구성하고 ** 오직 ** 테이블에 ** 항목이있는 사람들을 포함 할 수 있다고 생각한다. ON 문을 전체적으로 제외하고 나중에 고유 한 결과를 선택하십시오. –

답변

1
SELECT DISTINCT p.id, 
       p.[First Name], 
       p.[Last Name] 
FROM People AS p 
JOIN [Course Enrolment] AS ce ON p.id = ce.[Person ID] 
JOIN Courses AS c ON ce.[Course ID] = c.id 
LEFT JOIN [Course Participation] AS cp ON cp.[Person ID] = p.id AND 
              cp.[Course ID] = c.id 
WHERE cp.[Date Taken] IS NULL 
    OR cp.[Date Taken] < date('now', '-' || c.[Course Refresh Rate] || ' year') 
+0

멋진 답변을 주셔서 감사합니다. 추가해야 할 것은 세미콜론뿐이었습니다. – Sam

1

어떻게이 같은 모든 다른 사람으로부터 최근의 참가자를 필터링에 대한 : -

SELECT [First Name], 
     [Last Name] 
    FROM people AS p 
    JOIN courses AS c 
    JOIN [course enrolment] AS ce 
    ON p.id = ce.[Person ID] 
    AND c.id = ce.[Course ID] 

MINUS 

SELECT [First Name], 
     [Last Name] 
    FROM people AS p 
    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 [date taken] > date('now', '-' || [course refresh rate] || ' year') 

+0

여기 논리에 동의하며 응답 해 주셔서 감사합니다. 그러나 테스트 할 때 오류가 발생했습니다. – Sam