#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