【问题标题】:How to fix "1054 - unknown column on clause"如何修复“1054 - 子句上的未知列”
【发布时间】:2019-02-19 07:50:36
【问题描述】:

我编写了一个 sql 代码来从我的 MySQL 数据库中获取数据。但是当我运行 sql 查询时它返回一个错误。

我如何解决这个问题。我是新手,我用谷歌搜索,但找不到解决方案。

1054 - 'on clause' 中的未知列 'departments.department_id'

SELECT
    staff_data.first_name,
    staff_data.middle_name,
    staff_data.last_name,
    staff_data.gender,
    staff_data.civil_status,
    staff_data.birthday,
    staff_data.address_line_1,
    staff_data.address_line_2,
    staff_data.address_line_3,
    staff_data.contact_no_1,
    staff_data.contact_no_2,
    staff_data.nationality,
    staff_data.religion,
    staff_data.email,
    staff_data.is_deleted,
    staff_data.nic_number,
    staff_data.is_admin,
    departments.department_name,
    job_positions.position_name 
FROM
    departments,
    employee_position
    INNER JOIN job_positions ON job_positions.department_id = 
departments.department_id 
    AND departments.department_id = job_positions.department_id 
    AND employee_position.position_id = job_positions.position_id
    INNER JOIN staff_data ON employee_position.user_id = 
staff_data.nic_number 
WHERE
    employee_position.is_valid = 1

【问题讨论】:

  • 很明显,但您在 departments 表中没有列 department_id
  • 今日提示:始终使用现代、明确的JOIN 语法。更容易编写(没有错误),更容易阅读和维护,如果需要更容易转换为外连接! (显式 JOIN 链在逗号分隔的连接之前进行评估,因此您的 ON 子句没有将部门列包含在范围内。)

标签: mysql sql


【解决方案1】:

不要将旧式连接语法与现代语法(您应该只使用后者)混用。这是您使用现代连接语法的更正查询:

SELECT
    s.first_name,
    s.middle_name,
    s.last_name,
    s.gender,
    s.civil_status,
    s.birthday,
    s.address_line_1,
    s.address_line_2,
    s.address_line_3,
    s.contact_no_1,
    s.contact_no_2,
    s.nationality,
    s.religion,
    s.email,
    s.is_deleted,
    s.nic_number,
    s.is_admin,
    d.department_name,
    j.position_name 
FROM departments d
INNER JOIN job_positions j
    ON j.department_id = d.department_id 
INNER JOIN employee_position e
    ON e.position_id = j.position_id
INNER JOIN staff_data s
    ON e.user_id = s.nic_number
WHERE
    e.is_valid = 1;

您看到的错误可能是因为您使用旧式连接语法将 MySQL 解析器置于某种模式,随后该模式的行为与您预期的不同。

请注意,我还引入了表别名,这使查询更易于阅读。

【讨论】:

  • 那个看起来更好!
  • 它会返回这样的错误。 ' > 1064 - 您的 SQL 语法有错误;检查与您的 MariaDB 服务器版本相对应的手册,以在 e.position_id = j.position_id INNER JOIN staff_data s ON e.user_id = s.nic at line 25' 附近使用正确的语法。我的 MariaDB 服务器版本是:10.1.34 .
  • @Thilinajayakody 抱歉,该行丢失了ON。我没有测试我的查询,而是根据您的问题进行测试。
  • 它有效。谢谢你。你能推荐一个网站来学习现代 SQL 语法作为教程吗?
  • 我不喜欢大多数 SQL 教程网站。花时间在 Stack Overflow 上确实是一种很好的学习方式。查看 Tech on the Net 以获得良好的 SQL 参考站点。
【解决方案2】:

问题在于第一次加入

SELECT
    staff_data.first_name,
    staff_data.middle_name,
    staff_data.last_name,
    staff_data.gender,
    staff_data.civil_status,
    staff_data.birthday,
    staff_data.address_line_1,
    staff_data.address_line_2,
    staff_data.address_line_3,
    staff_data.contact_no_1,
    staff_data.contact_no_2,
    staff_data.nationality,
    staff_data.religion,
    staff_data.email,
    staff_data.is_deleted,
    staff_data.nic_number,
    staff_data.is_admin,
    departments.department_name,
    job_positions.position_name 
FROM
    departments,
    employee_position
    INNER JOIN job_positions ON 
    job_positions.department_id = <change to req col>
    -- departments.department_id join between employee_position and job_positions, but join is on department table 
    AND departments.department_id = job_positions.department_id 
    AND employee_position.position_id = job_positions.position_id
    INNER JOIN staff_data ON employee_position.user_id = 
staff_data.nic_number 
WHERE
    employee_position.is_valid = 1

【讨论】:

    猜你喜欢
    • 2019-08-16
    • 2021-07-22
    • 1970-01-01
    • 2021-05-06
    • 2011-02-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多