select 列表中的别名和字段之间的字段名称不明确

Ambiguous field name between an alias and a field in the select list with name

我有一个 SQL 查询 link 许多 table 使用单词 "using" 并且 table 之一出现在每个元素中,错误:

Ambiguous field name between an alias and a field in the select list with the name. ID_DEPARTMENT

如何正确更改查询?请求 link: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))

这是一个初始化计划项目的查询,每个项目都属于它自己的部门,所以我每次都需要添加部门table。 数据库架构:Database schema

我附上数据库文件example 当前版本的火鸟:2.5.7

问题是您重复加入 table departments 而没有使用别名。当您随后在 select 列表中引用 departments.id_department 时,Firebird 不知道它需要使用 departments 的四个实例中的哪一个。

您要么需要更改查询以便只引用 departments 一次,要么如果出于某种原因您需要它(我认为您不需要,如 scaisEdge 的回答所示),您需要为每次出现的 departments 明确指定别名,然后使用正确的别名限定列名。

您有几个不明确的列,第一个出现在 departmentsteachersanddepartmentsteachers 的嵌套连接中。

但是每次您使用相同的列名来表示不同的 table。你有同样的问题,所以我已经消除了 teachersanddepartmentssubjectsclassroomsgroups:

的列歧义
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,因此 JOIN 的 () 似乎也是不必要和多余的。

使用嵌套连接,您连接 table 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)