SQL-запрос для проверки, не существует ли запись в другой таблице

#sql #sqlite #join

#sql #sqlite #Присоединиться

Вопрос:

У меня есть таблица, в которой содержатся сведения обо всех учащихся, которые в настоящее время зачислены на занятия, которая выглядит следующим образом:

 CREATE TABLE studentInClass(
studentID int,
classID int,
FOREIGN KEY(studentID) references students(studentID),
foreign key(classID) references class(classID)
);
  

И другая таблица, содержащая сведения о студентах, которые заплатили за занятия:

 CREATE TABLE fees(
feesID INTEGER PRIMARY KEY AUTOINCREMENT, 
StudentID INTEGER, 
AmountPaid INT, 
Date DATE, 
FOREIGN KEY(StudentID) REFERENCES students(StudentID));
  

Что я хочу сделать, так это проверить, не заплатил ли студент, который находится в классе, за этот класс. Я изо всех сил пытаюсь написать SQL-запрос, который делает это. Я пробовал несколько запросов, таких как:

 Select studentInClass.StudentID
from fees, studentInClass 
where fees.StudentID = studentInClass.StudentID;
  

Но это не возвращает никаких данных. Я не уверен, как действовать дальше. Любая помощь будет оценена.

Комментарии:

1. Откуда вы знаете, что плата взимается за определенный класс? Я не вижу никаких ссылок на классы в таблице платы.

2. Согласен с @stickybit. В случае, если вас волнует только то, заплатил ли студент какую-либо сумму денег, вы можете сделать это с помощью простого LEFT JOIN и затем WHERE fees.StudentID IS NULL , потому что, если студент появится в studentInClass , но не появится в fees , это приведет NULL к нужной таблице.

Ответ №1:

Вы хотите outer join :

 select s.StudentID, (case when f.AmountPaid is not null 
                          then 'Yes' 
                          else 'No' 
                     end) as Is_fees_paid
from studentInClass s left join
     fees f
     on f.StudentID = s.StudentID; 
  

Ответ №2:

С НЕ СУЩЕСТВУЕТ:

 select s.*
from studentInClass s
where not exists (
  select 1 from fees
  where studentid = s.studentid
) 
  

при этом вы получаете все строки из таблицы, studentInClass для которых в таблице нет идентификатора studentid fees .
Неясно, нужно ли вам также проверять дату.

Ответ №3:

проверьте это, пожалуйста:

 select studentInClass.StudentID
from studentInClass inner join fees ON fees.StudentID = studentInClass.StudentID