【问题标题】:can I query an SQL database and combine four tables in one go?我可以查询一个 SQL 数据库并一次合并四个表吗?
【发布时间】:2021-10-07 06:18:35
【问题描述】:

我正在学习 sql 命令行,并通过终端在 mysql 中使用命令。我正在研究 INNER JOIN,我发现它很容易,但我有一个疑问,我必须解决否则无法传递给其他命令。

我有这四个表:departments、employees、employees_projects、projects

这些表格有以下内容:

部门: id int 名称 varchar(60)

员工: id int 名字 varchar(60) 姓氏 varchar(60) 工资 int 部门ID int

employees_projects: project_id 整数 employee_id int

项目: id int 标题 varchar(60) start_date 日期 end_date 日期 预算说明

当我想使用 INNER JOIN 连接两个表时,我只是这样使用它:

SELECT employees.first_name, employees.last_name, departments.name
FROM employees
INNER JOIN departments ON employees.department_id = departments.id;

当我想加入三个表时,我使用以下内容:

SELECT employees.first_name, employees.last_name, departments.name, employees_projects.project_id
FROM ( (employees
INNER JOIN departments ON employees.department_id = departments.id)
INNER JOIN employees_projects ON employees.id = employees_projects.employee_id);

这是我的问题:如您所见,最后一行的结果会给我employees.first_name、employees.last_name、departments.name、employees_projects.project_id,这意味着我会得到员工的姓名、姓氏、部门和他们正在从事的项目的 ID。现在,考虑到我们上面的表,我无法创建一个单行 SQL 查询,结果是employees.first_name、employees.last_name、departments.name、projects.title。这意味着一个查询会给出员工的姓名、姓氏、部门和他们正在从事的项目的名称。

是否有可能在一行查询中实现这一点?

mysql> 谢谢大家!

编辑帖子:

我创建了以下行:

SELECT employees.first_name, employees.last_name, departments.name, projects.title FROM ( (employees, projects INNER JOIN departments ON employees.department_id = departments.id) INNER JOIN employees_projects ON projects.id = employees_projects.project_id AND employees_projects.employee_id = employees.id); 

但不幸的是,我收到了这个错误,这很奇怪,因为看起来是正确的列:

mysql> SELECT employees.first_name, employees.last_name, departments.name, projects.title FROM ( (employees, projects INNER JOIN departments ON employees.department_id = departments.id) INNER JOIN employees_projects ON projects.id = employees_projects.project_id AND employees_projects.employee_id = employees.id); 
ERROR 1054 (42S22): Unknown column 'employees.department_id' in 'on clause'
mysql> 

【问题讨论】:

  • 我删除了 sql server 标签,因为你明确提到了 MySql
  • 谢谢您,对发布我的问题的错误感到抱歉,我不太习惯这个论坛并尽力而为,再次感谢您。
  • “单行查询”是什么意思?最好对查询进行格式化,使其易于阅读和维护。
  • Gordon 我的意思是我需要知道是否使用一个命令行就能达到我想要的结果。也许这不可能这就是我问的原因。

标签: mysql sql join inner-join


【解决方案1】:

您可能熟悉算术符号。您可以使用任意数量的项创建算术表达式:

a + b + c + d

第一项之前没有任何内容。每个术语之间都有一个+。确实没有“主”项,因为加法具有交换律的代数性质。该表达式的结果与以下相同:

c + a + d + b

或任何其他的术语排序。

在 SQL 中,连接是类似的。理论上,您可以加入任意数量的表。

<table> INNER JOIN <table> ON <condition>
        INNER JOIN <table> ON <condition>
        INNER JOIN <table> ON <condition>

如果需要,您可以在此之后继续添加更多内容。 (我说理论上是因为 MySQL 或任何其他 SQL 产品只是该语言的一种实现,它可能有一个实际限制。在 MySQL 的情况下,限制是每个查询 63 个表,但这不是语言的错,它只是如何MySQL 的代码实现了连接。)

FROM 不是表达式的一部分,它不会将任何表命名为“主”表。内连接具有交换性,就像算术中的加法一样。事实上,MySQL 可以在运行查询时自行对表进行重新排序,如果结果证明查询具有更好的性能的话。

你尝试过这个加入:

FROM ( (employees, projects INNER JOIN departments 
    ON employees.department_id = departments.id) 
INNER JOIN employees_projects 
    ON projects.id = employees_projects.project_id 
    AND employees_projects.employee_id = employees.id); 

您混合了两种语法形式,这会导致问题。

逗号连接是 1989 年的,现在仍然有效。但他们无法进行 OUTER JOIN,因此在 1992 年将语法更改为包含 INNER/OUTER JOIN 关键字。

但问题是带有 INNER/OUTER JOIN 关键字的语法比逗号具有更高的优先级。因此,就好像您的查询在查询引擎甚至承认 employees 是查询的一部分之前加入了 projectsdepartments。当它检查引用employeesON 条件时,它并不知道该表。

这实际上已记录在案:https://dev.mysql.com/doc/refman/8.0/en/join.html 在页面底部附近搜索“JOIN 的优先级高于逗号运算符”。

解决方案是始终使用 1992 风格的语法。我会按照@Adamszsz 在另一个答案中编写查询的方式编写它。

【讨论】:

  • 非常感谢您令人印象深刻的解释,您确实帮助我理解了在线学习和体验之间的区别。
【解决方案2】:

使用需要这样的东西:

select emp.first_name,emp.last_name,d.name,p.title , p.id from employees emp
join departments d on d.id = emp.department_id
join employees_projects empp on empp.employee_id = emp.id
join projects p on p.id = empp.project_id

【讨论】:

  • Adam 我去试试,如果能帮到你,我马上告诉你,谢谢!
  • 检查表和字段名称中的拼写错误,因为我无法访问和准确了解您的数据库
  • 对不起,我没看懂你的台词,可能是因为我是初学者,但是如果你只使用FROM employees,你怎么能用employees_project加入表项目呢?我想如果你使用FROM表employees,那么每个后面的ON只能比较主表(FROM)中的一个字段和连接表(INNER JOIN)的一个字段,我错了吗?
  • Bill Karwin 在他的回答中向您解释了一切。但是我的代码应该可以正常工作,没有他说的任何问题。
  • 我知道是你写的,就是我不明白什么是emp,你写的employees emp,d 写join department d,p 写join projects p。我试图理解这些缩写的含义,我正在阅读 w3school 上的 SQL 文档,但我找不到这个答案,抱歉,尽我所能。
猜你喜欢
  • 2017-07-09
  • 1970-01-01
  • 2020-05-29
  • 2021-03-17
  • 2018-01-12
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多