在一个关系数据库中,可以表现分等级的信息。例如一个显示一个大型机构的雇员信息的组织系统图。
建立的表结构如下:
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 阅读(354)
评论(0) 编辑 收藏 引用 所属分类:
sql