使用VB.NET查询SQLServerCE中的故障

时间:2013-11-04 14:05:13

标签: sql vb.net sql-server-ce

我正在开展一个项目,我的目标是实现学校收费系统的自动化。 我正在VB.NET 2012中实现该项目,并使用SQLServerCE来处理数据。

我的情况是这样的:

我有两张表:'feecollection'和'StudentDetails'

表费用收集的列如下feecollection

同样,表StudentDetails的列如下StudentDetails

现在我想找出违纪者学生的姓名。 我正在根据名称,月份和违约者字段进行过滤。

逻辑:在给定月份收费的学生的姓名已经支付,因此默认是所有在学生详细信息中但不在费用收集中的名称,其默认字段为“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'

但是这个查询无法正常工作。 我在哪里出错?

1 个答案:

答案 0 :(得分: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;

这样你就可以获得StudentDetails中的所有记录,其中匹配的费用收集记录在违约者中为“0”,或者不存在。

修改

如果您仍想使用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')

我在简化的数据集上测试了这个:

StudentDetails:

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

feecollection:

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

使用此数据,top语句仅返回Charlie,而第二个语句返回Bob和Charlie。