我正在开展一个项目,我的目标是实现学校收费系统的自动化。 我正在VB.NET 2012中实现该项目,并使用SQLServerCE来处理数据。
我的情况是这样的:
我有两张表:'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'
但是这个查询无法正常工作。 我在哪里出错?
答案 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。