随笔-42  评论-12  文章-0  trackbacks-0

在一个关系数据库中,可以表现分等级的信息。例如一个显示一个大型机构的雇员信息的组织系统图。

a

建立的表结构如下:

CREATE TABLE employee (
emp_id          NUMBER (4) CONSTRAINT emp_pk PRIMARY KEY,
fname           VARCHAR2 (15) NOT NULL, 
lname           VARCHAR2 (15) NOT NULL, 
dept_id         NUMBER (2) NOT NULL,
manager_emp_id  NUMBER (4) CONSTRAINT emp_fk REFERENCES employee(emp_id),
salary          NUMBER (7,2) NOT NULL,
hire_date       DATE NOT NULL, 
job_id          NUMBER (3));

表中的数据如下:

SELECT emp_id, lname, dept_id, manager_emp_id, salary, hire_date
FROM employee;
   EMP_ID LNAME        DEPT_ID MANAGER_EMP_ID    SALARY HIRE_DATE 
--------- ---------- --------- -------------- --------- --------- 
     7369 SMITH             20           7902       800 17-DEC-80 
     7499 ALLEN             30           7698      1600 20-FEB-81 
     7521 WARD              30           7698      1250 22-FEB-81 
     7566 JONES             20           7839      2000 02-APR-81 
     7654 MARTIN            30           7698      1250 28-SEP-81 
     7698 BLAKE             30           7839      2850 01-MAY-80 
     7782 CLARK             10           7839      2450 09-JUN-81 
     7788 SCOTT             20           7566      3000 19-APR-87 
     7839 KING              10                     5000 17-NOV-81 
     7844 TURNER            30           7698      1500 08-SEP-81 
     7876 ADAMS             20           7788      1100 23-MAY-87 
     7900 JAMES             30           7698       950 03-DEC-81 
     7902 FORD              20           7566      3000 03-DEC-81 
     7934 MILLER            10           7782      1300 23-JAN-82 

employee表中有两个重要的部分:列manager_emp_id和emp_fk约束

先看几个简单的分等级查询:

如果需要找出根节点,只需要执行以下语句:

SELECT emp_id, lname, dept_id, manager_emp_id, salary, hire_date 
FROM employee 
WHERE manager_emp_id IS NULL;
 
   EMP_ID LNAME        DEPT_ID MANAGER_EMP_ID    SALARY HIRE_DATE 
--------- ---------- --------- -------------- --------- --------- 
     7839 KING              10                     5000 17-NOV-81

如果想要找出节点的父节点,本例中就是显示每个雇员的经理姓名,执行如下语句:

SELECT e.lname "Employee", m.lname "Manager" 
FROM employee e, employee m 
WHERE e.manager_emp_id = m.emp_id;
Employee   Manager
---------- ----------
SMITH      FORD
ALLEN      BLAKE
WARD       BLAKE
JONES      KING
MARTIN     BLAKE
BLAKE      KING
CLARK      KING
SCOTT      JONES
TURNER     BLAKE
ADAMS      SCOTT
JAMES      BLAKE
FORD       JONES
MILLER     CLARK

如果想要找出所有的页节点,本例中就是找出所有的普通雇员,使用如下语句:

SELECT emp_id, lname, dept_id, manager_emp_id, salary, hire_date 
FROM employee e
WHERE emp_id NOT IN 
(SELECT manager_emp_id FROM employee 
WHERE manager_emp_id IS NOT NULL);

注意where子句中的条件。

   EMP_ID LNAME        DEPT_ID MANAGER_EMP_ID    SALARY HIRE_DATE
            --------- ---------- --------- -------------- --------- ---------
            7369 SMITH             20           7902       800 17-DEC-80
            7499 ALLEN             30           7698      1600 20-FEB-81
            7521 WARD              30           7698      1250 22-FEB-81
            7654 MARTIN            30           7698      1250 28-SEP-81
            7844 TURNER            30           7698      1500 08-SEP-81
            7876 ADAMS             20           7788      1100 23-MAY-87
            7900 JAMES             30           7698       950 03-DEC-81
            7934 MILLER            10           7782      1300 23-JAN-82
            8 rows selected.

同样也可以使用如下的语句完成相同功能:

SELECT emp_id, lname, dept_id, manager_emp_id, salary, hire_date 
            FROM employee e
            WHERE NOT EXISTS 
            (SELECT emp_id FROM employee e1 WHERE e.emp_id = e1.manager_emp_id);
            
posted on 2007-10-11 17:15 tianjuchuan 阅读(353) 评论(0)  编辑 收藏 引用 所属分类: sql
只有注册用户登录后才能发表评论。