2016-06-20 27 views
0

问:滞留在Oracle输出

显示姓氏,薪水和工作的谁赚不是每个部门的所有收入最低的员工在美国以外的地区更加所有员工。 从此查询中排除总统和副总统。 (使用子查询/加入)

我不确定如何使用子查询正确构建这一正确

这是我曾尝试:

SELECT last_name, salary, job_id 
FROM employees join locations 
USING(department_id) 
WHERE job_id <> ANY (SELECT * 
        FROM employees 
        WHERE job_id <> 'AD_PRES' OR job_id <> 'AD_VP') 
AND salary > 
        (SELECT MIN(salary) 
        FROM employees 
        WHERE country_id <> 'US'); 

关于如何正确构建任何帮助表示赞赏。谢谢。

+0

个部门表和EMPLOYEES表仅2部门标识 – bp06km

回答

0
SELECT 
    last_name, salary, job_id 
FROM employees a 
INNER JOIN locations b ON a.department_id = b.department_id 
WHERE a.job_id NOT IN (
    SELECT job_id 
    FROM employees 
    WHERE 
     (job_id <> 'AD_PRES' OR job_id <> 'AD_VP') AND 
     salary > (
      SELECT MIN(salary) 
      FROM employees 
      WHERE country_id <> 'US' 
     ) 
); 

有用吗?

+0

ORA-00904: “B” “DEPARTMENT_ID”:无效的标识符 00904. 00000 - “%S:无效识别符” * 原因: *操作: 错误在线路:4列:45 – bp06km

+0

啊位置表没有department_id属性 – bp06km

+0

位置只有国家名称的信息 – bp06km

2
SELECT last_name, 
     salary, 
     job_id 
FROM (
    SELECT last_name, 
     salary, 
     job_id, 
     RANK() OVER (PARTITION BY e.department_id ORDER BY salary) AS rnk 
    FROM employees e 
     INNER JOIN 
     departments d 
     ON (d.department_id = e.department_id) 
     INNER JOIN 
     locations l 
     ON (d.location_id = l.location_id) 
    WHERE e.job_id NOT IN ('AD_PRES', 'AD_VP') 
    AND l.country_id <> 'US' 
) 
WHERE rnk > 1; 

输出

LAST_NAME      SALARY JOB_ID 
------------------------- ---------- ---------- 
Hartstein      13000 MK_MAN  
Banda       6200 SA_REP  
Johnson       6200 SA_REP  
Ande       6400 SA_REP  
Lee        6800 SA_REP  
Sewall       7000 SA_REP  
Tuvault       7000 SA_REP  
Marvins       7200 SA_REP  
Bates       7300 SA_REP  
Smith       7400 SA_REP  
Cambrault      7500 SA_REP  
Doran       7500 SA_REP  
Smith       8000 SA_REP  
Olsen       8000 SA_REP  
Livingston      8400 SA_REP  
Taylor       8600 SA_REP  
Hutton       8800 SA_REP  
Hall       9000 SA_REP  
McEwen       9000 SA_REP  
Sully       9500 SA_REP  
Bernstein      9500 SA_REP  
Greene       9500 SA_REP  
Fox        9600 SA_REP  
Bloom       10000 SA_REP  
Tucker       10000 SA_REP  
King       10000 SA_REP  
Zlotkey      10500 SA_MAN  
Vishney      10500 SA_REP  
Cambrault      11000 SA_MAN  
Abel       11000 SA_REP  
Ozer       11500 SA_REP  
Errazuriz      12000 SA_MAN  
Partners      13500 SA_MAN  
Russell      14000 SA_MAN 

查询2 - 不使用解析函数

SELECT last_name, 
     salary, 
     job_id 
FROM employees e 
     INNER JOIN 
     departments d 
     ON (d.department_id = e.department_id) 
     INNER JOIN 
     locations l 
     ON (d.location_id = l.location_id) 
WHERE e.job_id NOT IN ('AD_PRES', 'AD_VP') 
AND l.country_id <> 'US' 
AND e.salary > ANY(SELECT salary 
         FROM employees ee 
         WHERE ee.department_id = e.department_id); 

AND e.salary > (SELECT MIN(salary) 
        FROM employees ee 
        WHERE ee.department_id = e.department_id); 
+0

ORA-00904: “L” “DEPARTMENT_ID”:无效的标识符 00904. 00000 - “%S:无效的标识符” *原因: *动作: 行错误:12列:15 – bp06km

+0

@ bp06km更新 – MT0

+0

那作品。你能解释Rank()和PARTITION BY吗?感谢 – bp06km