如何从表(部门,员工)中获取所有部门(dept_id,名称,dept_manager和total_employees)的详细信息?

时间:2019-09-17 05:20:50

标签: sql oracle

这是表格的详细信息:

员工:

   emp_ID | Primary Key
   emp_name | Varchar
   emp_email | varchar <br>
   emp_dept_id | Foreign Key

部门:

   dept_ID | Primary Key 
   dept_name | Varchar 
   emp_id | Foreign Key 

经理详细信息已经在employee表中。 我正在使用Oracle Database。 员工:

 emp_ID emp_name  emp_email    emp_dept_id
    1      Cyrus     abc@xyz.com  10
    2      Andrew    xyz@abc.com  20
    3      Mark      xyz@abc.com  10
    4      Tony      xyz@abc.com  10
    5      Elvis     xyz@abc.com  20
    6      Rock      xyz@abc.com  10
    7      George    xyz@abc.com  20
    8      Mary      xyz@abc.com  10
    9      Thomas    xyz@abc.com  20
    10      Martin   xyz@abc.com  10

部门:

dept_id     dept_name     emp_id
    10       Accounts     4
    20       Development  9

这些是表中的数据。在“部门”表中,emp_id(外键)指示部门的负责人/经理。

2 个答案:

答案 0 :(得分:0)

这非常简单。您要获取部门详细信息(1),并包括与该部门关联的员工(2)。

  1. 获取部门详细信息:
    SELECT <dept_col1>, <dept_col2>, ...
    FROM Department
  1. 获取每个部门的员工摘要:
SELECT dept_ID, <aggregation> AS MyAgg
FROM department
GROUP BY dept_ID

在这里,您用要查找的内容替换<aggregation>。您的情况应该是COUNT(*)

  1. 合并两个结果。您想要将数据从(2)连接到(1)。这两个表有什么关系?在这里,您编写了一个LEFT JOIN以将它们连接到PK / FK关系:
    SELECT 
      dept.<col1>, dept.<col2>, ..., 
      COALESCE(emp.MyAgg,0) AS MyAgg
    FROM Department dept
    LEFT JOIN (
      SELECT dept_ID, <aggregation> AS MyAgg
      FROM department
      GROUP BY dept_ID
    ) emp ON dept.<FK> = emp.<PK>
  1. 通过添加另一个LEFT JOIN获取部门经理的信息:
    SELECT 
      dept.<col1>, dept.<col2>, ..., 
      mgr.<col1>, 
      COALESCE(emp.MyAgg,0) AS MyAgg -- In case there are 0 employees
    FROM Department dept
    LEFT JOIN employee mgr ON dept.<FK> = mgr.<PK>
    LEFT JOIN (
      SELECT dept_ID, <aggregation> AS MyAgg
      FROM department
      GROUP BY dept_ID
    ) emp ON dept.<FK> = emp.<PK>

尝试一下,看看能走多远。如果您遇到困难,请告诉我。

答案 1 :(得分:0)

您可以尝试以下查询:

nvarchar

干杯!