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

1 ... 128 129 130 [ 131 ] 132 133 134 ... 219


MySQL и PostgreSQL

Чтобы исключить дубликаты из результирующего множества, используйте ключевое слово DISTINCT:

select distinct job from emp

Кроме того, устранение дубликатов может обеспечить оператор GROUP BY:

select job from emp group by job

Обсуждение

DB2, Oracle и SQL Server

Это решение строится на несколько ином подходе к ранжирующим функциям с сегментированием. Применение PARTITION BY в конструкции OVER функции ROW NUMBER обеспечивает, что для каждой новой должности порядковый номер, возвращаемый ROW NUMBER, будет сбрасываться до исходного значения, 1. Ниже приведены результаты выполнения вложенного запроса Х:

select job,

row number()over(partition by job order by job) rn from emp

JOB RN

ANALYST 1

ANALYST 2

CLERK 1

CLERK 2

CLERK 3

CLERK 4

MANAGER 1

MANAGER 2

MANAGER 3

PRESIDENT 1

SALESMAN 1

SALESMAN 2

SALESMAN 3

SALESMAN 4

Каждой строке присваивается порядковый номер. Для каждой должности нумерация начинается заново с 1. Чтобы отсеять дубликаты, надо просто выбрать строки, в которых RN равно 1.

При использовании функции ROW NUMBER OVER присутствие оператора ORDER BY обязательно (кроме DB2), но не оказывает влияния на результат. Какой из дубликатов будет возвращен, не важно, поскольку возвращается по одной строке для каждой из должностей.



MySQL и PostgreSQL

Первое решение показывает, как с помощью ключевого слова DISTINCT исключить дубликаты из результирующего множества. Помните, что DISTINCT применяется ко всему списку SELECT. Дополнительные столбцы могут и, безусловно, изменят результирующее множество. Рассмотрим, чем отличаются два приведенных ниже запроса:

select distinct job from emp

select distinct job, deptno from emp

DEPTNO

ANALYST

ANALYST

CLERK

CLERK

MANAGER

CLERK

PRESIDENT

CLERK

SALESMAN

MANAGER

MANAGER

MANAGER

PRESIDENT

SALESMAN

После добавления DEPTNO в список SELECT из таблицы EMP будут выбраны уникальные пары значений JOB/DEPTNO.

Второе решение реализует исключение дубликатов с помощью GROUP BY. Хотя GROUP BY используется таким образом довольно часто, необходимо помнить, что GROUP BY и DISTINCT - это два очень разных оператора, и они не являются взаимозаменяемыми. Я включил GROUP BY в это решение, чтобы наше обсуждение было полным, поскольку, несомненно, вы когда-нибудь столкнетесь с таким его применением.

Ход конем Задача

Требуется получить множество, содержащее имя каждого служащего, отдел, в котором он работает, его заработную плату, дату его приема на работу и заработную плату сотрудника, принятого на работу последним в отделе. Должно быть получено следующее результирующее мно-

жество:

DEPTNO

ENAME

HIREDATE

LATEST SAL

MILLER

1300

23-JAN-1982

1300

KING

5000

17-NOV-1981

1300

CLARK

2450

09-JUN-1981

1300

ADAMS

1100

12-JAN-1983

1100

SCOTT

3000

09-DEC-1982

1100

FORD

3000

03-DEC-1981

1100

JONES

2975

02-APR-1981

1100

SMITH

17-DEC-1980

1100



JAMES

03-DEC-1981

MARTIN

1250

28-SEP-1981

TURNER

1500

08-SEP-1981

BLAKE

2850

01-MAY-1981

WARD

1250

22-FEB-1981

ALLEN

1600

20-FEB-1981

Значения столбца LATEST SAL определяются в результате хода конем , поскольку схема поиска их в таблице аналогична схеме перемещения шахматного коня. Чтобы найти эти значения, надо сделать ход конем : перепрыгнуть в строку, затем развернуться и перепрыгнуть в другой столбец (рис.11.1). Чтобы найти верные значения LATEST SAL, необходимо сначала для каждого отдела найти (перепрыгнуть в) строку с самой поздней датой HIREDATE и затем выбрать (перепрыгнуть в) столбец SAL этой строки.


Рис. 11.1. Ход конем


Термин ход конем придумал один мой очень смышленый сотрудник, Кей Янг. Я дал ему проверить рецепты и признался, что никак не могу придумать хорошее название для этого раздела. Поскольку здесь приходится сначала сформировать строку, а затем перепрыгнуть и взять значение из другой, он предложил термин ход конем .

Решение

DB2 и SQL Server

Чтобы найти для каждого отдела значение SAL служащего, принятого на работу последним, используем в подзапросе выражение CASE. Для всех остальных заработных плат возвращаем нуль. С помощью оконной функции MAX OVER во внешнем запросе получаем значения SAL, не равные нулю, для отдела каждого служащего:

1 select deptno,

2 ename,



1 ... 128 129 130 [ 131 ] 132 133 134 ... 219

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