|
Программирование >> Преобразование значений null
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:
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:
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(*)
|
© 2006 - 2024 pmbk.ru. Генерация страницы: 0
При копировании материалов приветствуются ссылки. |