我有一个SQL查询使用单词“using”链接许多表,其中一个表出现在每个元素中,错误:
别名与选择列表中具有名称的字段之间的不明确字段名称。 ID_DEPARTMENT
如何正确更改查询?请求链接:https://pastebin.com/t2rqMAut
select id_teacher, fio, post, teachersanddepartments.id_department,
name_of_department, id_subject, name_of_subject, specific,
subjects.id_department, name_of_department,
id_classroom, number_of_classroom, specific,
classrooms.id_department, name_of_department, id_group,
name_of_group, groups.id_department, name_of_department,
specifics, daytime, pair, NUMERATOR_DENOMINATOR, keyy, typekey
from ((((classes join teachers using(id_teacher) join teachersanddepartments
using(id_teacher) join departments using(id_department))
join subjects using (id_subject) join departments using(id_department))
join classrooms using(id_classroom) join departments using(id_department))
join groups using (id_group) join departments using(id_department))
这是一个初始化计划项目的查询,每个项目属于自己的部门,所以我每次都需要添加部门表。数据库架构:Database schema
我附加数据库文件example当前版本的Firebird:2.5.7
问题是你反复加入表departments
而没有别名。然后,当您在选择列表中引用departments.id_department
时,Firebird不知道它需要使用的四个departments
实例中的哪一个。
你需要更改你的查询,所以你只引用departments
一次,或者如果由于某种原因你需要它(我不认为你这样做,如scaisEdge的答案所示),你需要明确地为每个departments
和然后使用正确的别名限定列名称。
你有几个不明确的列,第一个出现在departments
,teachersanddepartments
和teachers
的嵌套连接中。
但是每次为不同的表使用相同的列名。你有同样的问题,所以我已经消除了teachersanddepartments
,subjects
,classrooms
,groups
的列的歧义:
select id_teacher
, fio
, post
, teachersanddepartments.id_department
, teachersanddepartments.name_of_department
, id_subject
, name_of_subject
, specific
, subjects.id_department
, subjects.name_of_department
, id_classroom
, number_of_classroom
, classrooms.specific
, classrooms.id_department
, classrooms.name_of_department
, id_group
, name_of_group
, groups.id_department
, groups.name_of_department
, groups.specifics
, daytime
, pair
, NUMERATOR_DENOMINATOR
, keyy
, typekey
from (
(
(
( classes join teachers using(id_teacher)
join teachersanddepartments using(id_teacher)
join departments ON departments.id_department = teachersanddepartments.id_department
)
join subjects using (id_subject) join departments using(id_department)
)
join classrooms using(id_classroom) join departments using(id_department)
)
join groups using (id_group) join departments using(id_department)
)
由于你使用INNER JOIN
的事实,加入的()
似乎是不必要和多余的。
使用嵌套连接,您将表departments
加入3次;如果没有()
嵌套连接,您只需要一个连接:
select id_teacher
, fio
, post
, teachersanddepartments.id_department
, teachersanddepartments.name_of_department
, id_subject
, name_of_subject
, specific
, subjects.id_department
, subjects.name_of_department
, id_classroom
, number_of_classroom
, classrooms.specific
, classrooms.id_department
, classrooms.name_of_department
, id_group
, name_of_group
, groups.id_department
, groups.name_of_department
, groups.specifics
, daytime
, pair
, NUMERATOR_DENOMINATOR
, keyy
, typekey
from classes join teachers using(id_teacher)
join teachersanddepartments using(id_teacher)
join departments ON departments.id_department = teachersanddepartments.id_department
join subjects using (id_subject)
join classrooms using(id_classroom)
join groups using (id_group)
正如Mark Rotteveel在正确答案中所建议的那样,这可能是您错误的原因
我做到了,我为所有部门表添加了别名。谢谢大家!你救我=)
select id_teacher, fio, post, teachersanddepartments.id_department , d1.name_of_department, id_subject, name_of_subject, subjects.specific, subjects.id_department, d2.name_of_department,
id_classroom, number_of_classroom, classrooms.specific, classrooms.id_department, d3.name_of_department, id_group, name_of_group, groups.id_department, d4.name_of_department,
specifics, daytime, pair, NUMERATOR_DENOMINATOR, keyy, typekey
from ((((classes join teachers using(id_teacher) join teachersanddepartments using(id_teacher) join departments d1 on d1.id_department = teachersanddepartments.id_department)
join subjects using (id_subject) join departments d2 on d2.id_department = subjects.id_department)
join classrooms using(id_classroom) join departments d3 on d3.id_department = classrooms.id_department)
join groups using (id_group) join departments d4 on d4.id_department = groups.id_department)