通过在子查询中使用连接表来寻找替代解决方案

Finding an alternate solution by using join tables in subqueries

所以,问题是这样的:写一个子查询 returns 一组行来查找实际上分配了一个或多个员工的所有部门。

以下是来自 tables(员工和部门)的片段:

    +-------------+-------------+-------------+----------+--------------------+------------+------------+----------+----------------+------------+---------------+
| EMPLOYEE_ID | FIRST_NAME  | LAST_NAME   | EMAIL    | PHONE_NUMBER       | HIRE_DATE  | JOB_ID     | SALARY   | COMMISSION_PCT | MANAGER_ID | DEPARTMENT_ID |
+-------------+-------------+-------------+----------+--------------------+------------+------------+----------+----------------+------------+---------------+
|         100 | Steven      | King        | SKING    | 515.123.4567       | 2003-06-17 | AD_PRES    | 24000.00 |           0.00 |          0 |            90 |
|         101 | Neena       | Kochhar     | NKOCHHAR | 515.123.4568       | 2005-09-21 | AD_VP      | 17000.00 |           0.00 |        100 |            90 |
|         102 | Lex         | De Haan     | LDEHAAN  | 515.123.4569       | 2001-01-13 | AD_VP      | 17000.00 |           0.00 |        100 |            90 |
|         103 | Alexander   | Hunold      | AHUNOLD  | 590.423.4567       | 2006-01-03 | IT_PROG    |  9000.00 |           0.00 |        102 |            60 |
|         104 | Bruce       | Ernst       | BERNST   | 590.423.4568       | 2007-05-21 | IT_PROG    |  6000.00 |           0.00 |        103 |            60 |
|         105 | David       | Austin      | DAUSTIN  | 590.423.4569       | 2005-06-25 | IT_PROG    |  4800.00 |           0.00 |        103 |            60 |
|         106 | Valli       | Pataballa   | VPATABAL | 590.423.4560       | 2006-02-05 | IT_PROG    |  4800.00 |           0.00 |        103 |            60 |
|         107 | Diana       | Lorentz     | DLORENTZ | 590.423.5567       | 2007-02-07 | IT_PROG    |  4200.00 |           0.00 |        103 |            60 |
|         108 | Nancy       | Greenberg   | NGREENBE | 515.124.4569       | 2002-08-17 | FI_MGR     | 12008.00 |           0.00 |        101 |           100 |
|         109 | Daniel      | Faviet      | DFAVIET  | 515.124.4169       | 2002-08-16 | FI_ACCOUNT |  9000.00 |           0.00 |        108 |           100 |
|         110 | John        | Chen        | JCHEN    | 515.124.4269       | 2005-09-28 | FI_ACCOUNT |  8200.00 |           0.00 |        108 |           100 |


+---------------+----------------------+------------+-------------+
| DEPARTMENT_ID | DEPARTMENT_NAME      | MANAGER_ID | LOCATION_ID |
+---------------+----------------------+------------+-------------+
|            10 | Administration       |        200 |        1700 |
|            20 | Marketing            |        201 |        1800 |
|            30 | Purchasing           |        114 |        1700 |
|            40 | Human Resources      |        203 |        2400 |
|            50 | Shipping             |        121 |        1500 |
|            60 | IT                   |        103 |        1400 |
|            70 | Public Relations     |        204 |        2700 |
|            80 | Sales                |        145 |        2500 |
|            90 | Executive            |        100 |        1700 |
|           100 | Finance              |        108 |        1700 |

这是示例解决方案:

SELECT  department_name 
FROM departments 
WHERE department_id IN 
(SELECT DISTINCT(department_id) 
FROM employees);

我正在尝试这样的事情:

SELECT department_name, count(*) AS dep_count
FROM departments
WHERE dep_count >= (SELECT department_name
                    FROM employees JOIN departments
                    ON employees.department_id=departments.department_id
                    WHERE department_id >=1)
GROUP BY department_name;

我正在寻找连接 table 子查询的解决方案。

您可以在 WHERE 子句中使用 EXISTS 子查询:

SELECT *
FROM departments d
WHERE EXISTS (SELECT * 
              FROM employees e
              WHERE e.department_id = d.department_id)

或者从 departmentsemployees 的简单 JOIN,从 departments:

中选择 DISTINCT
SELECT DISTINCT d.*
FROM departments d
JOIN employees e ON e.department_id = d.department_id

输出(对于您提供的示例数据):

DEPARTMENT_ID   DEPARTMENT_NAME     MANAGER_ID  LOCATION_ID
60              IT                  103         1400
90              Executive           100         1700
100             Finance             108         1700

Demo on SQLFiddle

请注意,如果您 想要 department_name,只需将上述查询中的 *d.* 替换为 department_name .

SELECT department_name
FROM departments JOIN employees USING (department_id)
GROUP BY department_name

或者,等价地:

SELECT DISTINCT department_name
FROM departments JOIN employees USING (department_id)