我是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的引用含糊不清......"
答案 0 :(得分:1)
如果您的目标是获得包含两种费用类型的学生列表,那么您可以使用group by
和having
代替:
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_code
和SELECT
,但实际上您已在子查询中两次引用这些字段(一次在子查询A
中,一次在子查询中{ {1}})。 SQL引擎不够智能,无法识别这些表示相同数据的副本,因此无法确定要查看哪个子查询字段。要按照您最初设计的方式完成查询,您需要明确告诉SQL引擎您希望在B
中看到哪些字段:
SELECT
答案 2 :(得分:0)
如果我正确理解您的问题,那么您正在寻找 fee_type_codes
值为1
和2
的学生。
这应该做你想要的:
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