别名与选择列表中具有名称的字段之间的不明确字段名称

问题描述 投票:0回答:3

我有一个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

sql firebird firebird2.5
3个回答
1
投票

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

你需要更改你的查询,所以你只引用departments一次,或者如果由于某种原因你需要它(我不认为你这样做,如scaisEdge的答案所示),你需要明确地为每个departments和然后使用正确的别名限定列名称。


1
投票

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

但是每次为不同的表使用相同的列名。你有同样的问题,所以我已经消除了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的事实,加入的()似乎是不必要和多余的。

使用嵌套连接,您将表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在正确答案中所建议的那样,这可能是您错误的原因


0
投票

我做到了,我为所有部门表添加了别名。谢谢大家!你救我=)

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)
© www.soinside.com 2019 - 2024. All rights reserved.