我遇到了一个不明确的专栏名称'非常感谢你对此的帮助,因为我坚持这个并且不明白。我正在学习SQL
基本上我正在尝试使用多个表生成未通过考试的学生详细信息。
select
examDate, examLevel, examSubject, examResult,
studentID, studentFirstName
from
completedExams, exams, student
where
(completedExams.examNo = exams.examNo)
and (completedExams.examResult = 'Fail')
错误:
Msg 209,Level 16,State 1,Line 2
不明确的列名称' studentID'。
答案 0 :(得分:7)
首先,您加入的方法已经过时了。当ANSI在92年推出新标准时,人们被要求停止这样做。你的查询应该从这样开始。
select
examDate,
examLevel,
examSubject,
examResult,
studentID,
studentFirstName
from completedExams
inner join exams
on completedExams.examNo = exams.examNo
and completedExams.examResult = 'Fail'
inner join student
on student.studentID = CompletedExams.StudentID
接下来让我们谈谈别名。为表格添加别名非常有帮助,因此您不会经常反复输入completedexams.
。您只需将新名称放在表名后面,然后就是金色。
select
examDate,
examLevel,
examSubject,
examResult,
studentID,
studentFirstName
from completedExams as c
inner join exams as e
on c.examNo = e.examNo
and c.examResult = 'Fail'
inner join student as s
on c.studentID = s.StudentID
现在,如果两个数据库中都存在该列,那么您必须在列之前应用该别名,这样数据库引擎才能知道您真正想要的列。我不确切知道哪个去哪里因为我没有连接到你的数据库但是这里是一个例子。
select
c.examDate,
c.examLevel,
e.examSubject,
e.examResult,
s.studentID,
s.studentFirstName
from completedExams as c
inner join exams as e
on c.examNo = e.examNo
and c.examResult = 'Fail'
inner join student as s
on s.studentID = c.StudentID
嗯,我希望有所帮助。这是Zane对sql或sql 101的介绍。
答案 1 :(得分:0)
您已完成的考试也可能有学生ID。 因此,当您加入学生和completedExam时,您将在联接表中获得两个学生ID。
你可以尝试联合你的表来选择propper id
select student.studentId, ... from ...
正如评论中所建议的那样,这不是加入表格的好方法。您应该考虑为三个表
指定连接列select student.studentId,... from completedExams, exams, student
where student.studentId=completedExams.studentId
and completedExams.examId=exams.id
答案 2 :(得分:0)
我建议你明确定义你在表之间建立的连接关系的类型。这将确保您从查询中获得最佳性能,并帮助确保数据库引擎尽可能使用最佳执行计划。在编写时,如果您有大量记录,查询的性能将受到影响。虽然数据库引擎确实可以根据where子句正确解释连接,但这可能导致后续的规模问题。
此外,使用表别名将大大有助于避免模糊列问题。
以下是一些参考资料......
http://technet.microsoft.com/en-us/library/ms187455(v=SQL.105).aspx
http://technet.microsoft.com/en-us/library/ms191517(v=SQL.105).aspx