Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/83.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
使用3个SQL表的子查询_Sql_Oracle_Subquery - Fatal编程技术网

使用3个SQL表的子查询

使用3个SQL表的子查询,sql,oracle,subquery,Sql,Oracle,Subquery,我试图显示每个城市工资最低的员工的姓氏。“城市”列位于名为“地点”的表下,而员工信息(工资、姓氏)位于员工下。这两个表都是相关的,不共享公共表,因此我必须依赖第三个表DEPARTMENTS来连接这两个表,因为DEPARTMENTS包含它与员工共享的department\u id以及它与位置共享的LOCATION\u id。到目前为止,这就是我所拥有的,但我在这方面遇到了麻烦,因为我在过去只使用了两张桌子 SELECT LAST_NAME FROM EMPLOYEES WHERE (DEPARTM

我试图显示每个城市工资最低的员工的姓氏。“城市”列位于名为“地点”的表下,而员工信息(工资、姓氏)位于员工下。这两个表都是相关的,不共享公共表,因此我必须依赖第三个表DEPARTMENTS来连接这两个表,因为DEPARTMENTS包含它与员工共享的department\u id以及它与位置共享的LOCATION\u id。到目前为止,这就是我所拥有的,但我在这方面遇到了麻烦,因为我在过去只使用了两张桌子

SELECT LAST_NAME
FROM EMPLOYEES
WHERE (DEPARTMENT_ID) IN
(SELECT DEPARTMENT_ID
FROM DEPARTMENTS
WHERE LOCATION_ID IN
(SELECT LOCATION_ID
FROM LOCATIONS
GROUP BY CITY
HAVING MIN(SALARY)));

您应该将表联接的概念从
WHERE
子句中分离出来。 使用
WHERE
过滤数据,使用
JOIN
将数据连接在一起

我想这就是你想要的。顺便说一下,如果可以的话,把所有的帽子都丢掉

SELECT
    LAST_NAME
FROM
    EMPLOYEES
    INNER JOIN (
        SELECT
            DEPARTMENTS.DEPARTMENT_ID, 
            CITY,
            MIN(SALARY) AS LOWEST_SALARY
        FROM
            EMPLOYEES
            INNER JOIN DEPARTMENTS ON EMPLOYEES.DEPARTMENT_ID = DEPARTMENTS.DEPARTMENT_ID
            INNER JOIN LOCATIONS ON DEPARTMENTS.LOCATION_ID = LOCATIONS.LOCATION_ID
        GROUP BY
            DEPARTMENTS.DEPARTMENT_ID,
            LOCATIONS.CITY
    ) AS MINIMUM_SALARIES
    ON EMPLOYEES.DEPARTMENT_ID = MINIMUM_SALARIES.DEPARTMENT_ID
       AND EMPLOYEES.SALARY = MINIMUM_SALARIES.LOWEST_SALARY

这似乎是SQL入门课程中的一个作业。因此,假设您不能使用分析函数、
match\u recognize
子句等,只使用连接和聚合

在下面WHERE子句的子查询中,我们计算每个城市的最低工资。为此,我们需要连接所有三个表。然后在整个查询中,我们再次连接这三个表,并使用子查询作为in条件(半连接)。整个查询如下所示:

select e.last_name
from   employees e join departments d 
                     on e.department_id = d.department_id
                   join locations   l
                     on d.location_id   = l.location_id
where  ( e.salary, l.city ) in 
       (
         select   min(salary), city
         from     employees e join departments d 
                                on e.department_id = d.department_id
                              join locations   l
                                on d.location_id   = l.location_id
         group by city
       )
;

首先,连接这些表,以便在一行中看到city和employee。如果我们按城市分组,我们可以得到每个城市的最低工资

with city_employees as
(
  select l.city, e.*
  from locations l 
  join departments d using (location_id)
  join employees e using (department_id)
)
select last_name 
from city_employees 
where (city, salary) in
(
  select city, min(salary)
  from city_employees
  group by l.city
);
但是,使用窗口功能(
min over
rank over
此处)更容易实现同样的效果


“最低工资”的联接应为“最低工资”,因为使用了别名。所有上限在Oracle中都是标准的。这也可以按城市返回倍数的最低工资,因为它也按
部门ID
分组。这意味着您可以从同一个城市接收多个员工,这些员工的工资等于他们所在部门所在城市的最低工资。只需从子查询中删除
Department\u ID
,并在outside@Twelfth-你在说什么?甲骨文里哪里有“标准”的大写字母?哦,我明白了。那么我不同意。关于所有大写字母的唯一“标准”是将表名和列名转换为数据字典中的所有大写字母。关于为Oracle编写的SQL代码,没有任何关于大写的内容。(事实上,如果你至少在这个网站上搜索我的答案,你会发现它们都是小写的,而且它们只是甲骨文,我不知道其他任何东西)。只要不在任何地方使用双引号,表名和列名就可以用任何大小写。“丢掉所有的帽子”的建议是正确的。哎呀,我注意到这和mathguy二十分钟前给出的答案是一样的。抱歉。lol-答案下面有一个小小的
delete
链接,可以用于这种情况。我看到您使用了WITH子句,在这里它非常有意义,因为同一个连接使用了两次。我也曾想过这样做,但我不知道在SQL的入门课程中,他们是如何很早就引入WITH子句的。
select last_name
from
(
  select 
    e.last_name,
    e.salary,
    min(e.salary) over (partition by l.city) as min_salary
  from locations l 
  join departments d using (location_id)
  join employees e using (department_id)
)
where salary = min_salary;