1

クラス

  • ClassId(PK)
  • クラス名
  • ClassCapacity

バッチ

  • BatchId(PK)
  • BatchName
  • サイズ
  • ステータス{未開始、登録済み、完了済み}

BatchClass

  • BatchClassId(PK)
  • BatchId(FK)
  • ClassId(FK)
  • NoOfStudents

関係

  • クラスには最大容量があるため、バッチには多くのクラスを含めることができますが、特定の時点で、ステータスが=登録済みの1つのバッチにのみクラスを割り当てることができます(これはアプリケーション側から検証されます)

ステータスが登録済みと等しくないバッチに現在割り当てられていないすべてのクラスを取得したい

これは私が試したものです、

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

どうもありがとうございました。私はこれを回避する方法を考え出しました。モムード・ガマルに感謝します。デモはとても役に立ちました。

これが解決策です。

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 に答える