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

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

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

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 20.11.2012, 15:35   #1
Negaty
Новичок
Джуниор
 
Регистрация: 20.11.2012
Сообщений: 3
По умолчанию Сравнение одной записи с несколькими

Есть таблица с тремя полями

1 уникальный номер строки

2 наименование работника

3 наименование отдела

сколько всего пользователей и отделов неизвестно
Одному и тому же работнику может несколько раз поставлен в соответствие один и тот же отдел.
Требуется вывести всех работников которые состоят во всех отделах.
Пробовал поставить COUNT и сравнивать с COUNT DISTINCT но тогда нужен какая-то проверка вхождения в каждый из отделов

Последний раз редактировалось Negaty; 20.11.2012 в 16:00.
Negaty вне форума Ответить с цитированием
Старый 20.11.2012, 16:13   #2
Serge_Bliznykov
Старожил
 
Регистрация: 09.01.2008
Сообщений: 26,229
По умолчанию

Цитата:
состоят во всех отделах.
именно во всех? если отделов, допустим, 10, а работник состоит в девяти, его уже отображать не надо?

и ещё, задача явно учебная?! (в реально имя работника не может являться его идентифицирующим признаков, например, Ивановых И.И. явно может быть больше одного!)
да и вообще, имхо, задача достаточно "безумная"...

по поводу решения...
с COUNT() идея хорошая (на мой взгляд, как бы даже безальтернативная!).
я бы выбирал тех работников, у кого count() совпадает с количеством отделов (select count() from таблица group by Наименование_Отдела)
Serge_Bliznykov вне форума Ответить с цитированием
Старый 20.11.2012, 16:28   #3
Negaty
Новичок
Джуниор
 
Регистрация: 20.11.2012
Сообщений: 3
По умолчанию

да, не надо
да, учебная
"Одному и тому же работнику может несколько раз поставлен в соответствие один и тот же отдел."
совпадение по количеству может быть еще и в случае повторения его имени с одним и тем же отделом.
В идеале как то совместить IN и ALL но ALL только с мат выражениями.
Есть какой-нибудь способ подвыделения всех повторений [Имя] чтобы сравнить [Отдел]ы данные им в соотношение с DISTINCT[Отдел]?

Последний раз редактировалось Negaty; 20.11.2012 в 16:31.
Negaty вне форума Ответить с цитированием
Старый 20.11.2012, 16:46   #4
Аватар
Старожил
 
Аватар для Аватар
 
Регистрация: 17.11.2010
Сообщений: 18,922
По умолчанию

Во вложенном запросе сгруппировать по всем трем полям, внешний запрос делает то, что Serge_Bliznykov предложил. Да, если вложение во FROM СУБД допускает
Если бы архитекторы строили здания так, как программисты пишут программы, то первый залетевший дятел разрушил бы цивилизацию
Аватар вне форума Ответить с цитированием
Старый 20.11.2012, 16:52   #5
Serge_Bliznykov
Старожил
 
Регистрация: 09.01.2008
Сообщений: 26,229
По умолчанию

вхождение одно и того же работника в один и тот же отдел легко отбросить с помощью DISTINCT или с помощью
select Работник, Отдел from ТаблицаС group by Работник, Отдел

я не берусь утверждать, что предложенный ниже вариант правильный, (и что единственный - тем более), но попробовать можно...

Код:
select * from ТаблицаС 
  where Работник in (select AA.Работник from 
      (select Работник, Отдел from ТаблицаС group by Работник, Отдел) AA
      having count(*) = 
          (select max(KOtdel) from (select count(*) as KOtdel 
                                                 from TablicaC group by Отдел))
      group by  AA.Работник)

мда.. самому не нравится, то что наворотил..
значит, должно быть более эффективное и красивое решение...
Serge_Bliznykov вне форума Ответить с цитированием
Старый 22.11.2012, 15:29   #6
Negaty
Новичок
Джуниор
 
Регистрация: 20.11.2012
Сообщений: 3
По умолчанию

спасибо вышеотписавшимся, в итоге придумал:
SELECT [USER] From tb_test Group by [user]
HAVING COUNT(DISTINCT (otdel)) = (SELECT COUNT(DISTINCT (otdel)) FROM tb_test)
Negaty вне форума Ответить с цитированием
Старый 22.11.2012, 16:20   #7
Serge_Bliznykov
Старожил
 
Регистрация: 09.01.2008
Сообщений: 26,229
По умолчанию

Negaty, браво!
вот теперь элегантно! И правильно!


p.s. справедливости ради, хочу сказать, что мой вариант тоже был рабочим...
Код:
select AA.[user] from 
      (select [user], Otdel 
            from tb_test  group by [user], Otdel) AA
      group by AA.[user]   
      having count(*) = 
          (select max(BB.KOtdel) from (select count(*) as KOtdel 
                            from tb_test  group by Otdel) BB)
хотя, конечно, Ваше решение короче и красивее!
Serge_Bliznykov вне форума Ответить с цитированием
Ответ


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

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Удалить из файла абзац с номером К(абзацы отделяются друг от друга одной или несколькими пустыми строками Ragnaradi Помощь студентам 21 01.05.2011 12:02
Сравнение нескольких ячеек с одной Makintosh_87 Microsoft Office Excel 2 11.09.2010 02:00
Выделить из строки подстроки, разделённые одной или несколькими запятыми Striker14 Помощь студентам 1 19.02.2009 08:33