CREATE OR REPLACE VIEW v AS SELECT * FROM emp WHERE deptno != 10 UNION ALL SELECT * FROM emp WHERE ename = 'WARD'; SQL> set linesize 200 SQL> select * from v where v.ename='WARD'; EMPNO ENAME JOB MGR HIREDATE SAL COMM DEPTNO ---------- ---------- ---------- ---------- -------------- ---------- ---------- ---------- 7521 WARD SALESMAN 7698 22-2月 -81 1250 500 30 7521 WARD SALESMAN 7698 22-2月 -81 1250 500 30 SQL> select * from emp where ename='WARD'; EMPNO ENAME JOB MGR HIREDATE SAL COMM DEPTNO ---------- ---------- ---------- ---------- -------------- ---------- ---------- ---------- 7521 WARD SALESMAN 7698 22-2月 -81 1250 500 30 用全关联的话: SQL> SELECT v.empno, v.ename, b.empno, b.ename FROM v FULL JOIN emp b ON (b.empno = v.empno) WHERE (v.empno IS NULL OR b.empno IS NULL); 2 3 4 EMPNO ENAME EMPNO ENAME ---------- ---------- ---------- ---------- 7839 KING 7782 CLARK 7934 MILLER 会丢失ENAME=WARD的数据,可以使用标量子查询: SQL> SELECT empno,ename,job,mgr,hiredate,sal,comm,deptno, /*这儿使用的语句就叫标量子查询,以主表返回每一行的值为条件进行查询*/ (SELECT COUNT(*) FROM v v2 WHERE v2.empno = v.empno) AS cnt FROM v 2 3 4 ; EMPNO ENAME JOB MGR HIREDATE SAL COMM DEPTNO CNT ---------- ---------- ---------- ---------- -------------- ---------- ---------- ---------- ---------- 7369 SMITH CLERK 7902 17-12月-80 800 20 1 7499 ALLEN SALESMAN 7698 20-2月 -81 1600 300 30 1 7521 WARD SALESMAN 7698 22-2月 -81 1250 500 30 2 7566 JONES MANAGER 7839 02-4月 -81 2975 20 1 7654 MARTIN SALESMAN 7698 28-9月 -81 1250 1400 30 1 7698 BLAKE MANAGER 7839 01-5月 -81 2850 30 1 7788 SCOTT ANALYST 7566 09-12月-82 3000 20 1 7844 TURNER SALESMAN 7698 08-9月 -81 1500 0 30 1 7876 ADAMS CLERK 7788 12-1月 -83 1100 20 1 7900 JAMES CLERK 7698 03-12月-81 950 30 1 7902 FORD ANALYST 7566 03-12月-81 3000 20 1 EMPNO ENAME JOB MGR HIREDATE SAL COMM DEPTNO CNT ---------- ---------- ---------- ---------- -------------- ---------- ---------- ---------- ---------- 7521 WARD SALESMAN 7698 22-2月 -81 1250 500 30 2 已选择12行。 SQL> SELECT empno,ename,job,mgr,hiredate,sal,comm,deptno, (SELECT COUNT(*) FROM emp b WHERE b.empno = emp.empno) AS cnt FROM emp 2 3 ; EMPNO ENAME JOB MGR HIREDATE SAL COMM DEPTNO CNT ---------- ---------- ---------- ---------- -------------- ---------- ---------- ---------- ---------- 7369 SMITH CLERK 7902 17-12月-80 800 20 1 7499 ALLEN SALESMAN 7698 20-2月 -81 1600 300 30 1 7521 WARD SALESMAN 7698 22-2月 -81 1250 500 30 1 7566 JONES MANAGER 7839 02-4月 -81 2975 20 1 7654 MARTIN SALESMAN 7698 28-9月 -81 1250 1400 30 1 7698 BLAKE MANAGER 7839 01-5月 -81 2850 30 1 7782 CLARK MANAGER 7839 09-6月 -81 2450 10 1 7788 SCOTT ANALYST 7566 09-12月-82 3000 20 1 7839 KING PRESIDENT 17-11月-81 5000 10 1 7844 TURNER SALESMAN 7698 08-9月 -81 1500 0 30 1 7876 ADAMS CLERK 7788 12-1月 -83 1100 20 1 EMPNO ENAME JOB MGR HIREDATE SAL COMM DEPTNO CNT ---------- ---------- ---------- ---------- -------------- ---------- ---------- ---------- ---------- 7900 JAMES CLERK 7698 03-12月-81 950 30 1 7902 FORD ANALYST 7566 03-12月-81 3000 20 1 7934 MILLER CLERK 7782 23-1月 -82 1300 10 1 已选择14行。 SQL> SELECT v.empno, v.ename, v.cnt, emp.empno, emp.ename, emp.cnt FROM (SELECT empno,ename,job,mgr,hiredate,sal,comm,deptno, /*这儿使用的语句就叫标量子查询,以主表返回每一行的值为条件进行查询*/ (SELECT COUNT(*) FROM v v2 WHERE v2.empno = v.empno) AS cnt FROM v) v FULL JOIN (SELECT empno,ename,job,mgr,hiredate,sal,comm,deptno, (SELECT COUNT(*) FROM emp b WHERE b.empno = emp.empno) AS cnt FROM emp) emp ON (emp.empno = v.empno AND emp.cnt = v.cnt) WHERE (v.empno IS NULL OR emp.empno IS NULL); 2 3 4 5 6 7 8 9 10 EMPNO ENAME CNT EMPNO ENAME CNT ---------- ---------- ---------- ---------- ---------- ---------- 7521 WARD 2 7521 WARD 2 7521 WARD 1 7782 CLARK 1 7839 KING 1 7934 MILLER 1 已选择6行。