簡體   English   中英

Oracle SQL 子查詢

[英]Oracle SQL sub query

我有一個做法,我應該找到收入高於平均工資的員工,並且在與姓氏包含字母 u 的員工一起工作的部門工作

我使用的 select 語句是

SELECT employee_id,
       last_name,
       salary
  FROM employees
 WHERE salary > (SELECT AVG(salary)
                   FROM employees )
   AND department_id IN(SELECT department_id
                          FROM employees
                         WHERE LOWER(last_name) LIKE '%u%')

任何人都可以檢查此聲明是否合適?

謝謝你

假設您的意思是數據庫中所有部門以及所有員工(無論是否活躍)的平均工資,這對我來說看起來不錯。

例如,我認為您可能對當前財政年度的所有在職員工更感興趣。

您尚未提供架構,因此請注意檢查以下條件:

  • 不活躍的部門
  • 不活躍/終止的員工
  • 您有興趣比較工資的時期

您的查詢看起來會起作用。 您可以重寫它以刪除所有子查詢(這將需要額外的表/索引掃描)並只使用分析查詢:

SELECT employee_id,
       last_name,
       salary
FROM   (
  SELECT employee_id,
         last_name,
         salary,
         AVG( salary ) OVER () AS avg_salary,
         COUNT( CASE WHEN LOWER( last_name ) LIKE '%u%' THEN 1 END )
           OVER ( PARTITION BY department_id ) AS num_last_name_with_u
  FROM   employees
)
WHERE  salary > avg_salary
AND    num_last_name_with_u > 0;

db<>小提琴

我的第一個問題你得到了預期的結果嗎?

讓我分解你的查詢

SELECT department_id FROM employees WHERE LOWER(last_name)

在這里,您正在選擇部門以便檢索部門 ID,當您需要的所有帶有姓氏的雇員 ID 包含您時,需要選擇部門 ID,因此將其更改為雇員 ID 而不是部門 ID

select avg(salary) over (partition by department_id order by employee_id) 

所以使用分區你必須得到每個部門的平均工資

SELECT employee_id,last_name,salary 
FROM 
employees 
WHERE salary>(SELECT AVG(salary) OVER (PARTITION BY department_id)
FROM 
employees ) 
AND employee_id IN
( SELECT employee_id 
FROM 
employees 
WHERE  LOWER(last_name) LIKE '%u%')

如果您在運行它時遇到任何問題,請告訴我,感謝您對 Query 進行任何更正

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM