这是我编写的SQL
SET SERVEROUTPUT ON
DECLARE
CURSOR overview IS
SELECT e.last_name, e.first_name, d.department_name, e.department_id
FROM employees e, departments d
where e.department_id = d.department_id
ORDER BY e.department_id;
lastdepartment employees.department_id%TYPE := 0;
BEGIN
FOR i in overview LOOP
IF lastdepartment != i.department_id THEN
lastdepartment := i.department_id;
DBMS_OUTPUT.PUT_LINE('-' || i.department_id||' '||i.department_name);
END IF;
DBMS_OUTPUT.PUT_LINE('---'||i.last_name ||' '||i.first_name);
END LOOP;
END;
它输出信息,以便借助for循环显示某个部门中所有雇员的名字和姓氏。主要思想是,同一部门中有很多员工,我不需要为每个部门输出部门,而只是做一些概述。输出示例如下:
-10 Administration
---Whalen Jennifer
-20 Marketing
---Fay Pat
---Hartstein Michael
-30 Purchasing
---Tobias Sigal
---Colmenares Karen
---Baida Shelli
我正在使用的方法是存储 PREVIOUS 元素的部门编号,并检查它是否与当前元素匹配。我想知道是否有一种方法可以检查当前元素的department_id和 NEXT 元素的department_id,因为这将删除我创建的变量。
答案 0 :(得分:1)
我宁愿使用嵌套循环:外部用于部门,内部用于员工:
SQL> begin
2 for cur_d in (select deptno, dname from dept order by deptno) loop
3 dbms_output.put_line(cur_d.deptno ||' '|| cur_d.dname);
4 for cur_e in (select ename from emp where deptno = cur_d.deptno) loop
5 dbms_output.put_line('-- ' || cur_e.ename);
6 end loop;
7 end loop;
8 end;
9 /
10 ACCOUNTING
-- CLARK
-- KING
-- MILLER
20 RESEARCH
-- SMITH
-- JONES
-- SCOTT
-- ADAMS
-- FORD
30 SALES
-- ALLEN
-- WARD
-- MARTIN
-- BLAKE
-- TURNER
-- JAMES
40 OPERATIONS
PL/SQL procedure successfully completed.
SQL>
答案 1 :(得分:1)
您可以使用ROW_NUMBER
为每个部门的员工编号。读取部门的第一位员工时,您将显示部门。
SET SERVEROUTPUT ON
DECLARE
CURSOR overview IS
SELECT
e.last_name, e.first_name, d.department_name, e.department_id,
ROW_NUMBER() OVER (PARTITION BY e.department_id ORDER BY e.employee_id) AS rn
FROM employees e
JOIN departments d ON d.department_id = e.department_id
ORDER BY e.department_id, e.employee_id;
BEGIN
FOR i in overview LOOP
IF i.rn = 1 THEN
DBMS_OUTPUT.PUT_LINE('-' || i.department_id || ' ' || i.department_name);
END IF;
DBMS_OUTPUT.PUT_LINE('---' || i.last_name || ' ' || i.first_name);
END LOOP;
END;