Программирование >>  Преобразование значений null 

1 ... 20 21 22 [ 23 ] 24 25 26 ... 219


count(*) as cnt emp

by empno,ename,job,mgr,hiredate,sal,comm,deptno

empno,ename,job,mgr,hiredate,sal,comm,deptno,

count(*) as cnt

by empno,ename,job,mgr,hiredate,sal,comm,deptno

empno,ename,job,mgr,hiredate,sal,comm,deptno,

count(*) as cnt

by empno,ename,job,mgr,hiredate,sal,comm,deptno

Чтобы найти совокупность отличий между представлением V и таблицей EMP, используйте операции над множествами MINUS и UNION

ALL:

from

group

union

select

from

group

except

select

from

group

Oracle

1 ( 2 3 4 5

10 11 12 13 14 15 16 17 18 19 20 21

select empno,ename,job,mgr,hiredate,sal,comm,deptno, count(*) as cnt from V

group by empno,ename,job,mgr,hiredate,sal,comm,deptno minus

select empno,ename,job,mgr,hiredate,sal,comm,deptno, count(*) as cnt from emp

group by empno,ename,job,mgr,hiredate,sal,comm,deptno union all

select empno,ename,job,mgr,hiredate,sal,comm,deptno, count(*) as cnt from emp

group by empno,ename,job,mgr,hiredate,sal,comm,deptno minus

select empno,ename,job,mgr,hiredate,sal,comm,deptno, count(*) as cnt from v

group by empno,ename,job,mgr,hiredate,sal,comm,deptno

MySQL и SQL Server

Чтобы найти сочетание строк, которых нет в представлении V, но есть в таблице EMP, и наоборот, используйте связанный подзапрос и операцию UNION ALL:



select

from

select

from 1

group

where

select

from

select

from

group

where

union

select

from

select

from

group

where

select

from

select

from

group

where

e.sal,e.comm,e.deptno, count(*) as cnt

sal,comm,deptno

v.sal,v.comm,v.deptno, count(*) as cnt

sal,comm,deptno

= e.empno = e.ename = e.job = e.mgr ate = e.hireda

= e.sal

o = e.deptno = e.cnt

v.sal,v.comm,v.deptno, count(*) as cnt

sal,comm,deptno

e.sal,e.comm,e.deptno, count(*) as cnt

sal,comm,deptno

= e.empno = e.ename = e.job = e.mgr ate = e.hireda

= e.sal



4 14

Поскольку операция UNION отфильтровывает дубликаты, в случае равного количества элементов в таблицах была бы возвращена всего одна строка. Тот факт, что в данном примере возвращено две строки, означает, что наборы строк таблиц разные.

DB2, Oracle и PostgreSQL

MINUS и EXCEPT работают одинаково, поэтому в данном обсуждении используем EXCEPT. Запросы перед и после операции UNION ALL очень похожи. Таким образом, чтобы понять решение, просто выполним отдельно запрос, предшествующий UNION ALL. Следующее множество получается в результате выполнения строк 1-11, приведенных в разделе Решение :

select empno,ename,job,mgr,hiredate,sal,comm,deptno, count(*) as cnt from V

group by empno,ename,job,mgr,hiredate,sal,comm,deptno except

select empno,ename,job,mgr,hiredate,sal,comm,deptno,

52 and v.deptno = e.deptno

53 and v.cnt = e.cnt

54 and coalesce(v.comm,0) = coalesce(e.comm,0)

55 ) Обсуждение

Несмотря на различие техник, суть всех решений одинакова:

1. Сначала находим в таблице EMP строки, которых нет в представлении V.

2. Затем комбинируем (UNION ALL) эти строки со строками представления V, которых нет в таблице EMP.

Если рассматриваемые таблицы идентичны, то не будет возвращено ни одной строки. Если таблицы отличаются, будут возвращены строки, которые обусловливают различие. Начать сравнение таблиц можно с проверки количества элементов в них, не углубляясь сразу в сопоставление данных. Следующий запрос - простой пример такого сравнения, которое подходит для всех СУБД:

select count(*)

from emp union

select count(*)

from dept

COUNT(*)



1 ... 20 21 22 [ 23 ] 24 25 26 ... 219

© 2006 - 2024 pmbk.ru. Генерация страницы: 0
При копировании материалов приветствуются ссылки.
Яндекс.Метрика