1

班级

  • 类 ID (PK)
  • 班级名称
  • 班级容量

  • 批次编号 (PK)
  • 批次名称
  • 尺寸
  • 状态 {未开始、已注册、已完成}

批处理类

  • BatchClassId (PK)
  • 批次 ID (FK)
  • 类 ID (FK)
  • 没有学生

关系

  • 一个类具有最大容量,因此一个批次可以有多个类,但在给定时间,一个类只能分配给一个批次,状态为 = 已注册(这要从应用程序端验证)

我想获取当前未分配给状态不等于已注册批次的所有类

这是我试过的,

SELECT C.* 
FROM Class C 
LEFT JOIN (
    Batch B 
      INNER JOIN BatchClass BC 
        ON B.BatchId = BC.BatchId
    ) ON C.ClassId = BC.ClassId 
WHERE B.Status <> "Enrolled";

即使当我尝试 WHERE B.Status = "Enrolled" 时,它也会提供所有已注册批次的课程。我想要的是从上面的 SQL 对我不起作用的对立。

我不确定我的设计或 SQL 语句是否有问题。请帮忙。先感谢您。

4

3 回答 3

1

这应该可以正常工作:

SELECT DISTINCT C.* 
FROM Class AS C 
INNER JOIN BatchClass AS BC ON C.ClassID = BC.ClassID
INNER JOIN Batch      AS B  ON B.BatchId = BC.BatchId 
WHERE B.Status <> 'Enrolled';

SQL 小提琴演示


更新 1

试试这个:

SELECT C.*
FROM Class AS C 
WHERE c.ClassID NOT IN(SELECT bc.ClassID
                       FROM BatchClass bc
                       INNER JOIN Batch b ON B.BatchId = BC.BatchId
                       WHERE b.status = 'Enrolled');

更新的 SQL Fiddle 演示

于 2013-02-17T06:33:08.260 回答
1

非常感谢每一位。我想出了一个解决办法。非常感谢 Mohmoud Gamal。演示帮助很大。

这是解决方案。

SELECT DISTINCT C.* 
FROM Class AS C
WHERE C.ClassId NOT IN
(SELECT BC.ClassId FROM BatchClass AS BC 
INNER JOIN Batch AS B ON  B.BatchId = BC.BatchId 
WHERE B.Status = 'Enrolled');

通过这种方式,它返回当前未分配给已注册批次的所有类。SQL Fiddle Demo更清楚地说明了这一点。

于 2013-02-17T07:36:53.233 回答
0

我认为您的结果错过了与任何批次无关的类。

SELECT C.* FROM Class C 
LEFT JOIN (    
    Batch B
    INNER JOIN BatchClass BC 
    ON B.BatchId = BC.BatchId
) ON C.ClassId = BC.ClassId
WHERE B.Status <> "Enrolled" OR
      B.Status is null;
于 2013-02-17T07:01:29.263 回答