SQL查询多表问题

Posted

技术标签:

【中文标题】SQL查询多表问题【英文标题】:SQL querying multiple table issue 【发布时间】:2015-08-19 13:31:37 【问题描述】:

我有 3 个表,即子表、员工表和部门表,其中包含一些示例数据。我需要获取:

    孩子的名字 相应员工的名字和姓氏 该员工经理的名字和姓氏。

我想根据上述条件将数据分列在列中。

子表:

+-----------+-------+
| empld_id  | name  |
+-----------+-------+
| 123456789 | Manny |
| 333445555 | Joy   |
| 987654321 | abner |
+-----------+-------+

员工表:

+-------+-------+-----------+-----+-----------+--------+
| fname | lname |    ssn    | sex | superssn  | deptNo |
+-------+-------+-----------+-----+-----------+--------+
| john  | smith | 123456789 | m   | 333445555 |      5 |
+-------+-------+-----------+-----+-----------+--------+

部门表:

+-----------------+--------+------------+
| department_name | deptNo | managerssn |
+-----------------+--------+------------+
| HQ              |      1 | 8888665555 |
| admin           |      4 | 9876543211 |
+-----------------+--------+------------+

我目前有这个查询:

select 
  A.name,
  B.fname, 
  B.lname 
from 
  child A, 
  employee B, 
  department C
where 
  A.empld_id= B.ssn and 
  C.managerssn = B.ssn;

【问题讨论】:

尽量避免逗号分隔的连接! 您是否在表上设置了主键和外键? 在继续操作之前,您肯定应该摆脱ancient join syntax。 【参考方案1】:

你快到了 - 你有经理的 SSN - 现在你需要做的就是将它加入到员工表中以获取他的详细信息。

继续查询的风格:

SELECT c.name, 
       e.fname, e.lname, 
       m.fname AS manager_fname, m.lname AS manager_lname
FROM   child c, employee e, department d, employee m
WHERE  c.empid_id = e.ssn AND d.managerssn = e.ssn AND m.ssn = d.managerssn

但是请注意,隐式连接(在 from 子句中有多个表)已经被弃用了一段时间,建议避免使用它们并改用显式 joins:

SELECT c.name, 
       e.fname, e.lname, 
       m.fname AS manager_fname, m.lname AS manager_lname
FROM   child c
JOIN   employee e ON c.empid_id = e.ssn
JOIN   department d ON d.managerssn = e.ssn
JOIN   employee m ON m.ssn = d.managerssn

【讨论】:

以上是关于SQL查询多表问题的主要内容,如果未能解决你的问题,请参考以下文章

关于access sql查询多表的问题

如何进行sql多表查询?

sql 多表关联查询

sql多表关联查询

多表的慢速 SQL 查询

Mybatis单表多表查询,动态SQL使用