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

1 ... 207 208 209 [ 210 ] 211 212 213 ... 219


Запрос 8

Требуется найти студентов, которые старше, по крайней мере, двух других студентов.

Возможно, удобнее будет перефразировать задачу так: Найти студентов, которые старше двух или более студентов . Здесь подойдет техника, аналогичная применяемой в Запросе 5 . Окончательное результирующее множество показано ниже (только студенты JING и MAGGIE не старше двух или более студентов):

SNO SNAME

1 AARON

2 CHUCK

3 DOUG

5 STEVE

7 BRIAN

8 KAY

9 GILLIAN

10 CHAD

MySQL и PostgreSQL

Чтобы найти студентов, которые старше как минимум двух других студентов, используйте агрегатную функцию COUNT и связанный подзапрос:

1 select s1..

2 from student s1

3 where 2 <= ( select count(*)

4 from student s2

5 where s2.age < s1.age )

DB2, Oracle и SQL Server

Чтобы найти студентов, которые старше как минимум двух других студентов, используйте ранжирующую функцию DENSE RANK:

1 select sno,sname,age

2 from (

3 select sno,sname,age,

4 dense rank()over(order by age) as dr

5 from student

6 ) x

7 where dr >= 3

Обсуждение

Подробное обсуждение представлено в Запросе 5 . Техники аналогичны в обоих случаях, единственное отличие состоит в том, что окончательная операция осуществляется в первом случае над счетчиком, во втором - над рангом.



and s2.age

> s3.age

SNO SNAME

1 AARON

2 CHUCK

3 DOUG

5 STEVE

7 BRIAN

8 KAY

9 GILLIAN

10 CHAD

Запросы с условием точно

Может показаться, что решать вопросы истинности чего бы то ни было просто. Во многих случаях так оно и есть. Но иногда ответ на вопрос об абсолютной истинности, особенно если это связано с объединением данных из связанных таблиц, может вызывать затруднения. Проблема произрастает из исключающей природы условия точно . Возможно, удобнее будет рассматривать его как условие только . К примеру, скажем, чем отличаются люди, которые носят туфли, и которые носят только туфли? Недостаточно просто удовлетворить условию; условие должно быть выполнено с гарантией того, что ни одно из других условий не выполняется.

Запрос 9

Найти преподавателей, которые читают именно один предмет.

Эту задачу можно сформулировать иначе: Найти преподавателей, которые читают только один предмет . Какой конкретно предмет - не важно, важно то, что только один предмет. Окончательное результирующее множество должно выглядеть следующим образом:

LNAME DEPT SALARY AGE

POMEL SCIENCE 500 65

Оригинальное решение

Эта задача является вариантом Запроса 6 , разница в том, что теперь мы работаем только с таблицей STUDENT. Решение Запроса 6 можно легко адаптировать для поиска студентов, которые старше, по крайней мере, двух других студентов , что и показано ниже:

select distinct s1.* from student s1, student s2, student s3 where s1.age > s2.age



MySQL и PostgreSQL

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

1 select p.lname,p.dept,p.salary,p.age

2 from professor p, teach t

3 where p.lname = t.lname

4 group by p.lname,p.dept,p.salary,p.age

5 having count(*) = 1

DB2, Oracle и SQL Server

Чтобы найти преподавателей, читающих только один предмет, используйте оконную функцию COUNT OVER:

1 select lname, dept, salary, age

2 from (

3 select p.lname,p.dept,p.salary,p.age,

4 count(*) over (partition by p.lname) as cnt

5 from professor p, teach t

6 where p.lname = t.lname

7 ) x

8 where cnt = 1

Обсуждение

Внутренним объединением таблицы PROFESSOR с таблицей TEACH мы гарантируем, что из рассмотрения исключаются все преподаватели, не читающие ни одного курса. В решении с агрегацией функция COUNT в конструкции HAVING возвращает преподавателей, читающих только один предмет. Во втором решении используется оконная функция COUNT OVER. Но обратите внимание, что в операторе PARTITION функции COUNT OVER этого решения и в операторе GROUP BY решения с агрегацией указаны разные столбцы таблицы PROFESSOR. В данном примере операторы GROUP BY и PARTITION BY могут отличаться, поскольку все фамилии в таблице TEACHER разные, т. е. исключение полей P.DEPT, P.SALARY и P.AGE из сегмента не влияет на операцию подсчета. В предыдущих решениях я намеренно использовал в операторе PARTITION решения с оконной функцией те же столбцы, что и в операторе GROUP BY решения с агрегацией, чтобы показать, что PARTITION является скользящей, более гибкой разновидностью GROUP BY.

Оригинальное решение

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



1 ... 207 208 209 [ 210 ] 211 212 213 ... 219

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