使用 Oracle 資料庫,我有兩個表:
Employees:
Employee_id | Number(6,0)
Last_name | Varchar2(20)
Hire_date | Date
Deparment_id| Number(4,0)
Job_history:
Employee_id | Number(6,0)
Start_date | Date
Deparment_id | Number(4,0)
我應該使用 WITH 子句找到當前在他們開始作業的同一部門作業的所有員工(hire_date = start_date 和相同的部門 ID)。我在子查詢中使用 JOIN 輕松獲得了正確的結果:
SELECT DISTINCT e.employee_id, e.last_name, e.hire_date,
e.department_id as current_dep, j.department_id as prev_dep
FROM hr.employees e
JOIN (SELECT employee_id, department_id, end_date, start_date
FROM hr.job_history ) j
ON e.employee_id = j.employee_id
WHERE e.department_id = j.department_id;
(右)輸出:

不幸的是,使用 WITH 子句我遇到了麻煩,因為我不確定如何管理兩個不同的表(我在網上找到的大多數示例都只有一個表)
--best try until now--
With find_emp as (SELECT hire_date, department_id
FROM hr.employees)
SELECT e.employee_id, e.last_name, e.department_id as curr_dep
FROM HR.employees e
WHERE e.hire_date IN (SELECT j.start_date
FROM hr.job_history j
JOIN hr.employees e
ON e.employee_id = j.employee_id);
(錯誤)輸出:

我做錯了什么?由于我是 SQL 新手,我將不勝感激每一個提示。非常感謝您提前。
uj5u.com熱心網友回復:
應該是其中的一些東西:
WITH start_dept AS
(
SELECT emp.employee_id, dept.deparment_id AS prev_dep
FROM employees emp
, job_history dept
WHERE emp.employee_id = dept.employee_id
AND emp.hire_date = dept.start_date
)
SELECT e.employee_id, e.last_name, e.hire_date, e.deparment_id AS current_dep, sd.prev_dep
FROM employees e
, start_dept sd
WHERE e.employee_id = sd.employee_id
AND e.deparment_id = sd.prev_dep;
(假設 Employees.deparment_id 是當前部門,Employees.hire_date 與 Job_history 中的 start_date 匹配)
uj5u.com熱心網友回復:
SQL WITH 子句創建“虛擬”表,您可以在以后的查詢中在該子句下參考這些表。這些表在記憶體中的查詢生命周期內都存在。它們有點像視圖。
您的示例不起作用,因為您正在建立一個名為 的虛擬表find_emp,但是您沒有使用它。
一個例子
WITH subquery AS (
SELECT col1 , col2, col3
FROM table1
WHERE col4=condition1
)
SELECT * FROM subquery;
希望有幫助。
uj5u.com熱心網友回復:
如果您正在尋找具有相同作業的員工,這意味著該員工的 JOB_HISTORY 表中只有一個條目。
因此,你可以做這樣的事情。
CREATE table dept (department_id, department_name) AS
SELECT 1, 'IT' FROM DUAL UNION ALL
SELECT 2, 'MARKETING' FROM DUAL UNION ALL
SELECT 3, 'SALES' FROM DUAL;
CREATE TABLE employees (employee_id, first_name, last_name, department_id, sal) AS
SELECT 1, 'Alice', 'Abbot', 1, 100000 FROM DUAL UNION ALL
SELECT 2, 'Beryl', 'Baron', 1, 50000 FROM DUAL;
CREATE table job_history (employee_id,
department_id) AS
SELECT 1, 1 FROM DUAL UNION ALL
SELECT 2, 1 FROM DUAL UNION ALL
SELECT 2, 3 FROM DUAL;
WITH rws AS
(
SELECT
e.employee_id,
e.first_name,
e.last_name,
e.department_id,
d.department_name
FROM EMPLOYEES e join dept d on e.department_id = d.department_id
WHERE EMPLOYEE_ID IN
(SELECT EMPLOYEE_ID FROM JOB_HISTORY GROUP BY EMPLOYEE_ID HAVING COUNT(EMPLOYEE_ID) =1)
)
SELECT
employee_id,
first_name,
last_name,
department_id,
department_name
FROM rws;
EMPLOYEE_ID FIRST_NAME LAST_NAME DEPARTMENT_ID DEPARTMENT_NAME
1 Alice Abbot 1 IT
轉載請註明出處,本文鏈接:https://www.uj5u.com/gongcheng/486123.html
上一篇:如何獲得下一個季度
下一篇:Oracle中的遠程表是什么?
