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

1 ... 123 124 125 [ 126 ] 127 128 129 ... 219


select

from

TEST1

TEST2

Проанализировав эти результаты, видим, что результаты теста 70 для TEST1 и 90 для TEST2 являются взаимообратными (существуют результат 90 для TEST1 и результат 70 для TEST2). Аналогично результаты 80

Обсуждение

DB2, MySQL, PostgreSQL и SQL Server

Для данных продуктов предлагаются два решения. В первом условие OR располагается в конструкции JOIN, что делает его частью условия объединения. Тем самым можно фильтровать строки, извлекаемые из таблицы EMP, не теряя отделы с DEPTNO 30 и 40 из таблицы DEPT.

Во втором решении фильтрация перенесена во вложенный запрос. Он фильтрует записи по EMP.DEPTNO и возвращает интересующие нас строки EMP. Затем осуществляется их внешнее объединение с DEPT. Поскольку DEPT находится в левой части левостороннего внешнего объединения, возвращены будут все отделы, включая 30 и 40.

Oracle

Функции CASE и DECODE помогут избежать ошибок, которые возникли бы в случае реализации решения с помощью более старого синтаксиса внешнего объединения. В решении, использующем вложенный запрос Е, сначала из таблицы EMP выбираются необходимые строки, а затем выполняется их внешнее объединение с таблицей DEPT.

Выявление строк со взаимообратными значениями Задача

Имеется таблица, содержащая результаты двух тестов, и требуется найти пары взаимообратных значений. Рассмотрим результирующее множество, возвращаемое представлением V:



TEST1

TEST2

Решение

Используя рефлексивное объединение, выберите строки, в которых значения TEST1 равны значениям TEST2 и наоборот:

select distinct v1. *

from V v1, V v2

where v1.test1 = v2.test2

and v1.test2 = v2.test1

and v1.test1 <= v1.test2

Обсуждение

В результате рефлексивного объединения получаем декартово произведение, в котором каждый результат TEST1 можно сравнить с каждым результатом TEST2 и наоборот. Представленный ниже запрос выявит строки со взаимообратными значениями:

select v1.*

from V v1, V v2 where v1.test1 = v2.test2 and v1.test2 = v2.test1

TEST1 TEST2

20 20

20 20

20 20

20 20

для TEST1 и 130 для TEST2 являются взаимообратными для результатов 130 теста TEST1 и 80 теста TEST2. Кроме того, результаты 20 теста TEST1 и 20 теста TEST2 взаимообратные для результатов 20 теста TEST2 и 20 теста TEST1. Необходимо выбрать только один набор взаимообратных значений. Должно быть получено следующее результирующее множество:

TEST1 TEST2

20 20

70 90

80 130

но не такое:



В данном решении выбираются сотрудники с пятью самыми высокими заработными платами, а не пять самых высокооплачиваемых сотрудников, поэтому в результирующем наборе может быть более пяти записей. Если поставить задачу выбрать именно пять первых записей, то в SQL Server можно воспользоваться выражением TOP(5), а в MySQL и PostgreSQL -LIMIT 5. - Примеч. науч.ред.

90 70

130 80

70 90

80 130

Применение ключевого слова DISTINCT гарантирует удаление дублирующихся строк из окончательного результирующего множества. Последний фильтр предиката WHERE (and V1 .TEST1 <= V1.TEST2) обеспечит возвращение только одной пары взаимообратных значений (в которой значение TEST1 меньше или равно значению TEST2).

Как выбрать записи с n-ым количеством наивысших значений

Задача

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

Решение

Решение этой задачи складывается из двух частей: сначала строки ранжируются на основании любой интересующей нас величины, затем результирующее множество ограничивается необходимым числом строк.1

DB2, Oracle и SQL Server

Решение данной задачи зависит от использования ранжирующей функции. То, какая ранжирующая функция будет применяться, определяется тем, как должны обрабатываться связи. В следующем решении используется функция DENSE RANK, таким образом, все дублирующиеся значения заработной платы будут рассматриваться как одно значение:

1 select ename,sal

2 from (

3 select ename, sal,

4 dense rank() over (order by sal desc) dr

5 from emp

6 ) x

7 where dr <= 5



1 ... 123 124 125 [ 126 ] 127 128 129 ... 219

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