0

私は、学校の料金システムを自動化することを目標とするプロジェクトに取り組んでいます。私はVB.NET 2012でプロジェクトを実装し、SQLServerCEを使用してデータを処理しています。

私の状況は次のようなものです:

「feecollection」と「StudentDetails」という2つのテーブルがあります

テーブル料金コレクションの列は次のとおりです。料金徴収

同様に、表 StudentDetails の列は次のとおりです。学生詳細

今、私は不登校である学生の名前を見つけたいと思っています。Name、Months、および defaulter フィールドに基づいてフィルタリングを行っています。

ロジック : 特定の月の料金徴収にある学生の名前は支払い済みであるため、デフォルトは StudentDetails にあるが料金コレクションにないすべての名前であり、その defaulter フィールドは「1」です (1 は支払い済みを示します)。

私のクエリ:

select StudentDetails.Name where StudentDetails.Name not in
 (Select feecollection.Name, feecollection.Month, feecollection.defaulter, 
   StudentDetails.Name from feecollection 
   inner join StudentDetails on feecollection.Name = StudentDetails.Name 
   where StudentDetails.Name = 'def' and feecollection.month = 'January' 
   and feecollection.defaulter = '1'

しかし、このクエリは正しく機能していません。これのどこで間違ったのですか?

4

1 に答える 1

0

学生が支払いをしていないときに、デフォルト フィールドが「0」であるか、料金徴収レコードが欠落していると仮定すると、次のような SQL ステートメントを使用します。

SELECT StudentDetails.Name FROM StudentDetails 
    LEFT JOIN feecollection ON StudentDetails.Name = feecollection.Name 
    AND feecollection.Payment_For_Month = 'Jan' 
    WHERE feecollection.defaulter = '0' OR feecollection.defaulter IS NULL;

このようにして、一致する料金徴収レコードがデフォルトで「0」を持っているか、存在しない場合、StudentDetails のすべてのレコードを取得する必要があります。

編集

それでも IN 演算子を使用したい場合は、次のステートメントで実行する必要があります。

SELECT StudentDetails.Name FROM StudentDetails WHERE
    StudentDetails.Name NOT IN 
    (SELECT feecollection.Name FROM feecollection 
    WHERE feecollection.Payment_For_Month = 'Feb' 
    AND feecollection.defaulter = '1')

単純化されたデータセットでこれをテストしました。

生徒の詳細:

Name    Class    Section        
------------------------
Adam    101      Sect1
Bob     101      Sect
Charlie 101      Sect2

料金徴収:

Name    Payment_For_Month    defaulter
--------------------------------------
Adam    Jan                  1
Adam    Feb                  1
Bob     Jan                  1

このデータを使用すると、最初のステートメントは Charlie のみを返し、2 番目のステートメントは Bob と Charlie を返します。

于 2013-11-04T14:41:15.403 に答える