powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Проектирование БД [игнор отключен] [закрыт для гостей] / Какой вариант лучше?
7 сообщений из 7, страница 1 из 1
Какой вариант лучше?
    #33527980
Serj7
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Есть две таблицы, одна таблица пользователей, другая к примеру департаменты, запись в таблице пользователей содержит в себе идентификатор департамента. Нужно отобрать все департаменты, которые содержат больше 3 пользователей. Назрело два варианта решения:
Код: plaintext
1.
2.
3.
4.
select d.DepName
  from tDep d
 where  3  < (select  1 
              from tUser
             where u.DepID = d.DepID ) 
либо:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
select d.DepName
  from tDep d,
         (select u.DepID           as ID,
                   count(u.UserID) as Cnt
            from tUser u
           groupBy ID ) as cn
where d.DepID = cn.ID
   and cn.Cnt  >  3 

СУБД MS SQL 2000.
второй запрос привлекательней, но будет ли он работать на данной СУБД?
...
Рейтинг: 0 / 0
Какой вариант лучше?
    #33528039
Фотография softwarer
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Второй запрос привлекателен в первую очередь тем, что первый вряд ли верен :)

В остальном - имхо это тема для форума по MSSQL.
...
Рейтинг: 0 / 0
Какой вариант лучше?
    #33528066
Serj7
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Код: plaintext
1.
2.
3.
4.
select d.DepName
  from tDep d
 where  3  < (select count( 1 )
              from tUser u
             where u.DepID = d.DepID ) 
звиняюсь, забыл агрегатную функцию поставить
...
Рейтинг: 0 / 0
Какой вариант лучше?
    #33528078
gardenman
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Интересно, а такие выражения как GROUP BY и HAVING употреблять нельзя?
...
Рейтинг: 0 / 0
Какой вариант лучше?
    #33528103
Serj7
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Был и такой вариант:
Код: plaintext
1.
2.
3.
4.
5.
6.
select d.DepName, 
       count(u.UserID) as cnt
  from tDep   d,
       tUser  u
 where u.DepID = d.DepID
 group by DepName
 having cnt >  3 
Интересно, какой лучше и более оптимальный
...
Рейтинг: 0 / 0
Какой вариант лучше?
    #33528140
gardenman
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
with
   d (DepId,cnt) as (
      select count(*),DepID from tUser group by DepID having count(*)> 3 
   )
select
   tDep.DepName, d.cnt
from
   d,tDep
where
   d.DepId=t.DepId

Всяко сначала придется узнать сколько персонала в каждом из отделов.
После того как ID отделов вычислено- результат можно джойнить с таблицей отделов, чтобы вытащить имена.
...
Рейтинг: 0 / 0
Какой вариант лучше?
    #33530792
Serj7
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
gardenman
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
with
   d (DepId,cnt) as (
      select count(*),DepID from tUser group by DepID having count(*)> 3 
   )
select
   tDep.DepName, d.cnt
from
   d,tDep
where
   d.DepId=t.DepId
.

CTE появилось только в MS SQL 2005, а речь идет о 2000
...
Рейтинг: 0 / 0
7 сообщений из 7, страница 1 из 1
Форумы / Проектирование БД [игнор отключен] [закрыт для гостей] / Какой вариант лучше?
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]