[英]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;
我的第一個問題你得到了預期的結果嗎?
讓我分解你的查詢
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.