两个类似的子查询之间的SQL连接

时间:2015-12-18 16:21:08

标签: sql db2

我是SQL的初学者。我有两个表,一个是student_records,另一个是表student_fees,其中存在折扣费用(fee_type_code = 2)和常规费用(fee_type_code = 1)的学生记录。费用类型的代码是fee_type_code。由于某些学生获得两种费用类型,系统中存在错误。我想得到所有的错误记录。首先,我有两个单独工作的查询,但我试图在一个查询中合并它们,然后在临时表上创建一个连接:

select 
student_id, fee_type_code 
from
      ((select * from student_records r, student_fees f 
        where s.student_id=f.student_id and fee_type_code=1) A 
        inner join 
       (select * from student_records r, student_fees f 
        where       
        s.student_id=f.student_id and fee_type_code=2) B 
       on A.student_id=B.student_id);

我为任何不便提前道歉或者如果这是一个太天真的问题,但我会陷入困境。我得到的错误是"对student_id的引用含糊不清......"

3 个答案:

答案 0 :(得分:1)

如果您的目标是获得包含两种费用类型的学生列表,那么您可以使用group byhaving代替:

select sr.student_id
from student_records sr
join student_fees sf on sr.student_id = sf.student_id
where sf.fee_type_code in (1,2)
group by sr.student_id
having count(distinct sf.fee_type_code) = 2

答案 1 :(得分:1)

正如其他人之前提到的,您可以使用一些语法上更简单的技术来获取此数据集,但我想确保您了解原始查询的错误。

解释

  

“对student_id的引用含糊不清......”

您已在student_id语句中选择了fee_type_codeSELECT,但实际上您已在子查询中两次引用这些字段(一次在子查询A中,一次在子查询中{ {1}})。 SQL引擎不够智能,无法识别这些表示相同数据的副本,因此无法确定要查看哪个子查询字段。要按照您最初设计的方式完成查询,您需要明确告诉SQL引擎您希望在B中看到哪些字段:

SELECT

答案 2 :(得分:0)

如果我正确理解您的问题,那么您正在寻找 fee_type_codes值为12的学生。

这应该做你想要的:

Select  R.student_id
From    Student_records R
Join    Student_fees    F   On  R.Student_id = F.Student_id
Where   F.fee_type_code In (1, 2)
Group By R.student_id
Having Count(Distinct F.fee_type_code) = 2