【问题标题】:Task with nested subqueries in SQLSQL 中带有嵌套子查询的任务
【发布时间】:2022-12-05 15:05:50
【问题描述】:

使用表 HR.DEPARTMENTS 和 HR.EMPLOYEES,创建一个包含名为 John 的员工的部门的列表。

这是员工和部门表的示例:

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    17-JUN-03   AD_PRES   24000      -         -             90

DEPARTMENT_ID   DEPARTMENT_NAME MANAGER_ID  LOCATION_ID
10               Administration     200         1700

我试过这样的:

select department_id from HR.EMPLOYEES, HR.DEPARTMENTS 
where 'John' = (select first_name from hr.employees)

如何重写查询以使其正常工作?

【问题讨论】:

    标签: sql


    【解决方案1】:

    要重写查询以使其正常工作,您可以使用联接来组合员工表和部门表,然后使用子查询来筛选名为 John 的员工。以下是如何重写查询的示例:

    select departments.department_id
    from hr.employees employees
      join hr.departments departments
        on employees.department_id = departments.department_id
    where employees.first_name = 'John';
    

    此查询使用连接合并员工和部门表,然后过滤生成的记录以仅包含员工名字为“John”的记录。这将为您提供员工名为 John 的部门的部门 ID 列表。

    【讨论】:

      【解决方案2】:

      我会在这里使用存在逻辑而不是连接:

      SELECT DEPARTMENT_ID
      FROM HR.DEPARTMENTS d
      WHERE EXISTS (
          SELECT 1
          FROM HR.EMPLOYEES e
          WHERE e.DEPARTMENT_ID = d.DEPARTMENT_ID AND
                e.FIRST_NAME = 'John'
      );
      

      【讨论】:

        【解决方案3】:

        我们可以在这里使用 IN 子句:

        SELECT department_id
        FROM hr.departments
        WHERE department_id IN (
            SELECT department_id
            FROM hr.employees
            WHERE first_name = 'John');
        

        【讨论】:

          【解决方案4】:
          select department_id from HR.EMPLOYEES WHERE first_name = 'Steven';
          

          这应该工作。你不需要加入。

          如果要保证department_id存在于DEPARTMENTS表中,可以在EMPLOYEES表的DEPARTMENT_ID列上添加外键约束。

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 2018-10-12
            • 1970-01-01
            • 1970-01-01
            • 2012-09-19
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多