|
Программирование >> Преобразование значений null
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 в список SELECT из таблицы EMP будут выбраны уникальные пары значений JOB/DEPTNO. Второе решение реализует исключение дубликатов с помощью GROUP BY. Хотя GROUP BY используется таким образом довольно часто, необходимо помнить, что GROUP BY и DISTINCT - это два очень разных оператора, и они не являются взаимозаменяемыми. Я включил GROUP BY в это решение, чтобы наше обсуждение было полным, поскольку, несомненно, вы когда-нибудь столкнетесь с таким его применением. Ход конем Задача Требуется получить множество, содержащее имя каждого служащего, отдел, в котором он работает, его заработную плату, дату его приема на работу и заработную плату сотрудника, принятого на работу последним в отделе. Должно быть получено следующее результирующее мно-
Значения столбца LATEST SAL определяются в результате хода конем , поскольку схема поиска их в таблице аналогична схеме перемещения шахматного коня. Чтобы найти эти значения, надо сделать ход конем : перепрыгнуть в строку, затем развернуться и перепрыгнуть в другой столбец (рис.11.1). Чтобы найти верные значения LATEST SAL, необходимо сначала для каждого отдела найти (перепрыгнуть в) строку с самой поздней датой HIREDATE и затем выбрать (перепрыгнуть в) столбец SAL этой строки. Рис. 11.1. Ход конем Термин ход конем придумал один мой очень смышленый сотрудник, Кей Янг. Я дал ему проверить рецепты и признался, что никак не могу придумать хорошее название для этого раздела. Поскольку здесь приходится сначала сформировать строку, а затем перепрыгнуть и взять значение из другой, он предложил термин ход конем . Решение DB2 и SQL Server Чтобы найти для каждого отдела значение SAL служащего, принятого на работу последним, используем в подзапросе выражение CASE. Для всех остальных заработных плат возвращаем нуль. С помощью оконной функции MAX OVER во внешнем запросе получаем значения SAL, не равные нулю, для отдела каждого служащего: 1 select deptno, 2 ename,
|
© 2006 - 2024 pmbk.ru. Генерация страницы: 0
При копировании материалов приветствуются ссылки. |