Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Web программирование > SQL, базы данных
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 28.05.2011, 15:31   #1
Frosts
Пользователь
 
Регистрация: 15.03.2011
Сообщений: 12
По умолчанию упрощение SQL запросов

помогите пожалуйста, избавиться от вложенных селектов в двух запросах:

1 запрос: Найти сотрудников, работавших в должности начальника отдела, и
не работавших в должности зам. директора.

SELECT *
FROM [worker]
WHERE [id_P] IN ( SELECT [id_P]
FROM [Post]
WHERE [название] = 'начальник отдела' ) AND
NOT IN ( SELECT [id_P]
FROM [Post]
WHERE [название] = 'зам. директора' )


2 запрос: Вывести список отделов, в которых у начальника ровно два заместителя.

SELECT b.*
FROM [Otdel] b
INNER JOIN
(SELECT id_O, COUNT(название) AS Naz
FROM [Post]
WHERE [название] = 'зам начальника'
GROUP BY [id_O] ) m
ON b.id_O = m.id_O AND m.Naz = 2



Сущности: Отдел (Otdel), Должность (Post), Сотрудник (worker).

Создание нормализованной БД:

Otdel (id_O,name)
Post (id_P, name, id_O)
worker (id_W, so-name, name, дата приема, дата увольнения, id_P)

create table Otdel(
id_O int unsigned not null auto_increment key,
name char(6));

create table Post (
id_P int unsigned not null auto_increment key,
name char(30),
id_O integer);

create table worker (
id_W int unsigned not null auto_increment key,
so-name char(30),
name char(20),
date_П DATE,
date_У DATE,
id_D integer);
Frosts вне форума Ответить с цитированием
Старый 28.05.2011, 17:28   #2
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,097
По умолчанию

Цитата:
1 запрос: Найти сотрудников, работавших в должности начальника отдела, и
не работавших в должности зам. директора.
Код:
SELECT worker.* 
FROM [worker]
Join  [Post] on ([название] = 'начальник отдела' and [название] <> 'зам. директора' )
I'm learning to live...
Stilet вне форума Ответить с цитированием
Старый 30.05.2011, 09:14   #3
evg_m
Старожил
 
Регистрация: 20.04.2008
Сообщений: 5,526
По умолчанию

Цитата:
Сообщение от Stilet Посмотреть сообщение
Код:
SELECT worker.* 
FROM [worker]
Join  [Post] on ([название] = 'начальник отдела' and [название] <> 'зам. директора' )
([название] = 'начальник отдела' and [название] <> 'зам. директора' ) === FALSE
(a=b) and (a<>b)
Код:
SELECT worker.* 
FROM [worker]
join  [Post] as pos1 on (worker.id_P =post1.id_P and post1.[название] = 'начальник отдела' )
join [Post] as post2 on (worker.id_P= post2.id_P and [название] <> 'зам. директора' )
where post1.id_P is not NULL  and post2.id_P.is null
хотя окончание скорее надо делать так
Код:
join [Post] as post2 on (worker.id_P= post2.id_P ) 
where post1.id_P is not NULL  and post2.id_P<>post1.id_P
либо вообще так
Код:
join  [Post] as pos1 on worker.id_P =post1.id_P 
join [Post] as post2 on worker.id_P= post2.id_P 
where post1.[название] = 'начальник отдела' 
  and post2.and post1.[название] <> 'начальник отдела' )
Для второго запроса можно предложить ТРИ соединения(join) с внутренними фильтром (on) несовпадение с предыдущими (... and post1.id_P <>post2.id_P) не забудьте по первоначальный фильтр по идентификатору.
lокончательный фильтр (where) два первых соединения IS NOT NULL а третье IS NULL.
программа — запись алгоритма на языке понятном транслятору

Последний раз редактировалось evg_m; 30.05.2011 в 09:36.
evg_m вне форума Ответить с цитированием
Старый 30.05.2011, 10:33   #4
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,097
По умолчанию

Цитата:
evg_m
Верно. Ступил маненько. Но тогда не очень то уж и упрощение получается, скорее усложнение.
I'm learning to live...
Stilet вне форума Ответить с цитированием
Старый 30.05.2011, 10:42   #5
evg_m
Старожил
 
Регистрация: 20.04.2008
Сообщений: 5,526
По умолчанию

Цитата:
Но тогда не очень то уж и упрощение получается, скорее усложнение.
решаем вот эту задачу.
Цитата:
помогите пожалуйста, избавиться от вложенных селектов в двух запросах:
заменяем каждый вложенный запрос(select) на одно подключение(join)
а что получится, то получится.
программа — запись алгоритма на языке понятном транслятору
evg_m вне форума Ответить с цитированием
Старый 30.05.2011, 19:00   #6
Frosts
Пользователь
 
Регистрация: 15.03.2011
Сообщений: 12
По умолчанию

спасибо большое, а вообще второй запрос верно составлен?

2 запрос: Вывести список отделов, в которых у начальника ровно два заместителя.

SELECT b.*
FROM [Otdel] b
INNER JOIN
(SELECT id_O, COUNT(название) AS Naz
FROM [Post]
WHERE [название] = 'зам начальника'
GROUP BY [id_O] ) m
ON b.id_O = m.id_O AND m.Naz = 2
Frosts вне форума Ответить с цитированием
Старый 30.05.2011, 19:54   #7
Serge_Bliznykov
Старожил
 
Регистрация: 09.01.2008
Сообщений: 26,229
По умолчанию

Цитата:
а вообще второй запрос верно составлен?
на мой взгляд - да...
я бы только вместо COUNT(название) AS Naz
написал ... COUNT(*) AS ChisloZamov
но для запроса это несущественно...
Serge_Bliznykov вне форума Ответить с цитированием
Старый 30.05.2011, 20:47   #8
Frosts
Пользователь
 
Регистрация: 15.03.2011
Сообщений: 12
По умолчанию

меня смущает строчка GROUP BY [id_O] ) m
поэтому я не знаю как переделать запрос
Frosts вне форума Ответить с цитированием
Старый 30.05.2011, 23:49   #9
Serge_Bliznykov
Старожил
 
Регистрация: 09.01.2008
Сообщений: 26,229
По умолчанию

Цитата:
меня смущает строчка GROUP BY [id_O] ) m
а меня - не смущает!


Цитата:
поэтому я не знаю как переделать запрос
зачем? Вы проверили данный запрос? Он работает? Тогда в чём суть проблемы?!
Serge_Bliznykov вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
12 SQL-запросов Best Programmist Microsoft Office Access 7 12.12.2009 20:46
ограничение кол-ва SQL запросов в BDE ?!!! Qdesnik БД в Delphi 1 15.05.2009 17:24
Написание SQL-запросов tsergey Помощь студентам 9 12.02.2009 11:17
использование SQL запросов в коде VBA b00s Microsoft Office Access 3 26.04.2008 13:40
несколько запросов SQL Arteom БД в Delphi 3 09.09.2007 23:39