【问题标题】:SQL Query to check if a record does not exist in another tableSQL查询检查另一个表中是否不存在记录
【发布时间】:2019-04-22 12:40:40
【问题描述】:

我有一个表格,其中包含当前注册的所有学生的详细信息,如下所示:

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;

但这不会返回任何数据。我不知道如何从这里开始。任何帮助将不胜感激。

【问题讨论】:

  • 你怎么知道收费是针对特定课程的?我在费用表中没有看到任何对课程的引用。
  • 同意@stickybit。如果您只关心学生是否支付了任何金额,您可以使用简单的LEFT JOIN 然后WHERE fees.StudentID IS NULL 因为如果学生出现在studentInClass 但没有出现在@987654327 @ 会将NULL 分配给正确的表。

标签: sql sqlite join


【解决方案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 中获得表 fees 中没有 studentid 的所有行。
    不清楚是否还需要查看日期。

    【讨论】:

      【解决方案3】:

      请检查:

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

      【讨论】:

        猜你喜欢
        • 2021-06-19
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2012-08-16
        • 2012-08-30
        • 2021-02-16
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多