数据来源:题目所需文件 上级ID显示的是上级部门的ID 题目要求: 该公司总共有三个层级,请用SQL查询出公司的组织架构情况,结果输出三个字段:一级部门名称、二级部门名称、三级部门名称
时间: 2024-05-09 19:15:03 浏览: 13
假设数据表名为 `departments`,包含字段 `id`、`name` 和 `parent_id`,其中 `parent_id` 表示上级部门的ID。可以使用如下 SQL 查询语句来获取公司的组织架构情况:
```
SELECT
d1.name AS level_1_name,
d2.name AS level_2_name,
d3.name AS level_3_name
FROM
departments d1
LEFT JOIN departments d2 ON d1.id = d2.parent_id
LEFT JOIN departments d3 ON d2.id = d3.parent_id
WHERE
d1.parent_id IS NULL
```
解释一下上面的查询语句:
- 通过 `LEFT JOIN` 连接三次 `departments` 表,分别命名为 `d1`、`d2` 和 `d3`
- 通过 `WHERE` 子句限制只查询一级部门,即 `d1` 表中 `parent_id` 为 `NULL` 的记录
- 查询结果中包含三个字段:一级部门名称、二级部门名称、三级部门名称,分别对应 `d1.name`、`d2.name` 和 `d3.name`
相关问题
CREATE TABLE department ( department_id NUMBER PRIMARY KEY, parent_id NUMBER, department_name VARCHAR(250) NOT NULL ); select * from department for update drop table department 该公司总共有三个层级,请用SQL查询出公司的组织架构情况,结果输出三个字段:一级部门名称、二级部门名称、三级部门名称
可以使用递归查询语句来查询公司的组织架构情况,以下是示例代码:
WITH RECURSIVE dept_tree AS (
SELECT department_id, parent_id, department_name, department_name AS full_path
FROM department
WHERE parent_id IS NULL
UNION ALL
SELECT d.department_id, d.parent_id, d.department_name, CONCAT(dt.full_path, ' > ', d.department_name)
FROM department d
JOIN dept_tree dt ON dt.department_id = d.parent_id
)
SELECT
CASE WHEN d1.department_name IS NULL THEN 'N/A' ELSE d1.department_name END AS level1,
CASE WHEN d2.department_name IS NULL THEN 'N/A' ELSE d2.department_name END AS level2,
CASE WHEN d3.department_name IS NULL THEN 'N/A' ELSE d3.department_name END AS level3
FROM dept_tree dt
LEFT JOIN dept_tree d1 ON dt.parent_id = d1.department_id
LEFT JOIN dept_tree d2 ON dt.parent_id = d2.parent_id AND d2.parent_id IS NOT NULL AND d1.department_id = d2.parent_id
LEFT JOIN dept_tree d3 ON dt.parent_id = d3.parent_id AND d3.parent_id IS NOT NULL AND d2.department_id = d3.parent_id
WHERE dt.parent_id IS NOT NULL
ORDER BY level1, level2, level3;
解释一下上述代码的逻辑:
- 使用 WITH RECURSIVE 定义一个递归查询语句 dept_tree,首先查询出所有 parent_id 为空的部门作为第一级部门;
- 然后使用 UNION ALL 连接查询,将每个部门的子部门递归查询出来,同时使用 CONCAT 函数将每个部门的完整路径记录下来;
- 最后使用 LEFT JOIN 将每个部门与其父部门和祖父部门(如果有的话)连接起来,查询出每个部门所属的三个级别,如果没有对应的级别则用 'N/A' 表示。
注意:上述代码中的 SELECT * from department for update drop table department 是错误的 SQL 语句,不要在实际场景中使用!
sql根据公司id查询部门所有列表,按层级递增排序
您可以使用以下 SQL 语句来根据公司 id 查询部门列表,并按层级递增排序:
```sql
SELECT * FROM department
WHERE company_id = 'your_company_id'
ORDER BY parent_id ASC, id ASC;
```
其中,`department` 表是您存储部门信息的表,`company_id` 是您要查询的公司 id,`parent_id` 是每个部门的父部门 id,`id` 是每个部门的 id。使用 `ORDER BY` 子句,首先按照 `parent_id` 递增排序,然后按照 `id` 递增排序,可以得到按照层级递增排序的部门列表。