【问题标题】:SQL Join for multiple tables多个表的 SQL 连接
【发布时间】:2013-02-17 06:29:01
【问题描述】:

  • 类 ID (PK)
  • 类名
  • 类容量

批次

  • BatchId (PK)
  • 批次名称
  • 尺寸
  • 状态 {NotStarted, Enrolled, Completed}

批处理类

  • BatchClassId (PK)
  • BatchId (FK)
  • 类 ID (FK)
  • NoOfStudents

关系

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

我想将所有当前未分配的课程分配给状态不等于已注册

的批次

这是我尝试过的,

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 语句是否有问题。请帮忙。提前谢谢你。

【问题讨论】:

  • 有 2 个“不”-“当前不”和“不等于”。我猜您的意思是“获取当前未分配给状态等于已注册的批次的所有类”。
  • @Teddy 确切地说是的。当前注册的课程应免除所有课程。

标签: sql database-design left-join inner-join


【解决方案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 Fiddle Demo


更新 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');

Updated SQL Fiddle Demo

【讨论】:

  • 您好,感谢您的及时回复和演示。但在示例中,类 2 不应作为结果返回。我稍微编辑了演示以更具体地说明我的问题。看看这个link 在这个第 4 类和第 2 类中都不应该返回。因为第 2 类与当前注册的批次捆绑在一起,而第 4 类根本没有分配给批次。希望能澄清问题。干杯!
  • 太棒了。我也刚想通了。但是我将您的答案标记为正确,因为您的答案从一开始就很有帮助。非常感谢!!
  • @Randy - 随时欢迎您 :) 没关系,无论谁被接受 :) 很高兴我能提供帮助。这很重要。
【解决方案2】:

非常感谢大家。我想出了一个解决办法。非常感谢 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 更清楚地说明了这一点。

【讨论】:

    【解决方案3】:

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

    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;
    

    【讨论】:

      猜你喜欢
      • 2020-10-11
      • 1970-01-01
      • 2016-09-03
      • 2011-05-03
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多