oracle SQL连接多个表:更干净/更有效的代码可能吗?

z31licg0  于 2023-06-22  发布在  Oracle
关注(0)|答案(1)|浏览(105)

我在查询中加入了几个表:人力资源员工、人力资源部门、人力资源地点、人力资源国家/地区:人力资源人员:
| 姓名|薪金|department_id(指向人力资源部门)|
| - -----|- -----|- -----|
| ......这是什么?|......这是什么?|......这是什么?|
| ......这是什么?|......这是什么?|......这是什么?|

人力资源部门

| 部门ID| location_id(指向人力资源位置)|
| - -----|- -----|
| ......这是什么?|......这是什么?|
| ......这是什么?|......这是什么?|

人力资源地点

| 位置标识|country_id(指向人力资源国家)|
| - -----|- -----|
| ......这是什么?|......这是什么?|
| ......这是什么?|......这是什么?|

人力资源国家

| 国家ID|国家名称|
| - -----|- -----|
| ......这是什么?|......这是什么?|
| ......这是什么?|......这是什么?|
对于我的查询,我必须显示每个员工的工资高于或等于一个国家的平均工资
代码如下所示,并给出了正确的结果:

SELECT 
e.first_name || ' ' || e.last_name AS name,
TRIM(CAST(con.country_name AS CHAR(25))) AS country,
e.salary AS salary,
(SELECT ROUND(AVG(e1.salary)) FROM hr.employees e1
    JOIN hr.departments dep1 ON e1.department_id = dep1.department_id
    JOIN hr.locations loc1 ON dep1.location_id = loc1.location_id 
    WHERE country_id = loc.country_id
)AS avg_sal_country
FROM hr.employees e
JOIN hr.departments dep ON e.department_id = dep.department_id
JOIN hr.locations loc ON dep.location_id = loc.location_id
JOIN HR.countries con ON loc.country_id = con.country_id
WHERE (salary >= (SELECT AVG(e1.salary) FROM hr.employees e1
    JOIN hr.departments dep1 ON e1.department_id = dep1.department_id
    JOIN hr.locations loc1 ON dep1.location_id = loc1.location_id 
    WHERE country_id = loc.country_id) )
;

根据评分系统我的教授使用的成本我的声明是27而成本的查询从教授是16,我如何重写这是更有效的?
编辑:我的结果是这样的
| 姓名|国家|薪金|平均销售国|
| - -----|- -----|- -----|- -----|
| 鲍勃|美国|四千|三千八百|
| 苏西|英国|三千|二千年|
| 汤姆|美国|五千|三千八百|

ijxebb2r

ijxebb2r1#

我推荐窗口函数(也就是Oracle中的分析函数),它可以有效地替换代码中的子查询:

SELECT name, country, salary, ROUND(avg_sal_country) AS avg_sal_country
FROM (
    SELECT 
        e.first_name || ' ' || e.last_name AS name,
        TRIM(CAST(con.country_name AS CHAR(25))) AS country,
        e.salary,
        AVG(e.salary) OVER(PARTITION BY loc.country_id) AS avg_sal_country
    FROM hr.employees e
    JOIN hr.departments dep ON e.department_id = dep.department_id
    JOIN hr.locations loc ON dep.location_id = loc.location_id
    JOIN HR.countries con ON loc.country_id = con.country_id
) x
WHERE salary >= avg_sal_country

相关问题