Форум программистов, компьютерный форум, киберфорум
Microsoft SQL Server
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.82/11: Рейтинг темы: голосов - 11, средняя оценка - 4.82
 Аватар для Rhoxolan
13 / 13 / 7
Регистрация: 16.12.2020
Сообщений: 247

Вывести названия групп, у которых больше одного куратора

13.07.2022, 18:03. Показов 2420. Ответов 13

Студворк — интернет-сервис помощи студентам
Здравствуйте! Помогите, пожалуйста, разобраться с запросом.

Есть таблицы Groups и GroupsCurators.

Необходимо вывести названия групп, у которых больше одного куратора. Моя логика такова: Нужно вывести названия групп с табилцы Groups , ID которых встречается более 1-го раза в таблице GroupsCurators. Как это можно сделать и можно ли вообще?

Вот псевдокод-пример моей логики, используя подобие указателя this.
Code
1
2
3
SELECT this = Groups.Name
FROM Groups
WHERE COUNT(SELECT GroupsCurators.GroupId FROM GroupsCurators WHERE GroupsCurators.Id = this.id) > 2
0
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
13.07.2022, 18:03
Ответы с готовыми решениями:

Вывести названия групп, в которых есть студенты, не получающие стипендию
Вывести названия групп, в которых есть студенты, не получающие стипендию. Ошибка в том, что если вводить например 30 студентов у которых...

Вывести названия все членов типа t (в том числе унаследованные) и названия типов, в которых они были определены
Пожалуйста, помогите. Метод void example(Type t). Вывести названия все членов типа t (в том числе унаследованные) и названия типов, в...

В массиве целых чисел вывести все элементы, которые встречаются больше одного раза и индексы которых нечётные
Всем привет. Не знаю как правильно реализовать данную задачу: В массиве целых чисел вывести все элементы, которые встречаются больше одного...

13
5966 / 4542 / 1094
Регистрация: 29.08.2013
Сообщений: 28,151
Записей в блоге: 3
13.07.2022, 20:31
Цитата Сообщение от Rhoxolan Посмотреть сообщение
используя подобие указателя this
вы про это в какой книжке прочитали?

к тому же COUNT так не работает

Цитата Сообщение от Rhoxolan Посмотреть сообщение
Необходимо вывести названия групп, у которых больше одного куратора
значит в таблице GroupsCurators в поле GroupId будет несколько строк для одного ID
0
 Аватар для Rhoxolan
13 / 13 / 7
Регистрация: 16.12.2020
Сообщений: 247
14.07.2022, 10:19  [ТС]
Цитата Сообщение от qwertehok Посмотреть сообщение
вы про это в какой книжке прочитали?
к тому же COUNT так не работает
Это псевдокод, целью которого было показать предполагаемую логику запроса. За COUNT, конечно же, знаю.

Спасибо за совет, но задачу решил следующим образом:
T-SQL
1
2
3
4
5
SELECT Groups.Name, COUNT(GroupsCurators.GroupId)
FROM Groups
JOIN GroupsCurators ON GroupsCurators.GroupId = Groups.Id
GROUP BY Groups.Name
HAVING COUNT(GroupsCurators.GroupId) > 1
0
5966 / 4542 / 1094
Регистрация: 29.08.2013
Сообщений: 28,151
Записей в блоге: 3
14.07.2022, 12:50
Цитата Сообщение от Rhoxolan Посмотреть сообщение
но задачу решил следующим образом
а если в таблице 100 млн строк, но кураторов больше всего у 1 группы
вы сначала сджойните все 100 млн что бы найти 1 строку

я бы сначала сделал GROUP BY и получил GroupId, а потом уже получал Groups.Name только для конкретных значений
0
668 / 291 / 120
Регистрация: 12.04.2022
Сообщений: 1,000
14.07.2022, 13:37
Цитата Сообщение от qwertehok Посмотреть сообщение
я бы сначала сделал GROUP BY и получил GroupId, а потом уже получал Groups.Name только для конкретных значений
Оптимизатор достаточно умный, именно так он сделает, а не будет джоинить 100500 записей.
0
3614 / 2135 / 756
Регистрация: 02.06.2013
Сообщений: 5,169
15.07.2022, 04:32
Цитата Сообщение от PaulWist Посмотреть сообщение
Оптимизатор достаточно умный, именно так он сделает, а не будет джоинить 100500 записей.
Только если по Groups.Name есть ограничение уникальности.
Нужно просто group by GroupsCurators.Id, Groups.Name
0
668 / 291 / 120
Регистрация: 12.04.2022
Сообщений: 1,000
15.07.2022, 08:12
Цитата Сообщение от invm Посмотреть сообщение
Только если по Groups.Name есть ограничение уникальности.
Репро-код

T-SQL
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
use tempdb
create table Groups (Id int primary key clustered, Name varchar); --<< Not Unique
create table GroupsCurators (ID int identity primary key, GroupId int foreign key references Groups(Id) );
create index idx on GroupsCurators(GroupId)
 
insert into Groups values (1, '1'),(2, '2')
 
insert into GroupsCurators (GroupId) values (1);
 
insert into GroupsCurators (GroupId) select top 100000 2 from sys.all_objects;
 
-- SET SHOWPLAN_All  Off; -- На любителя
 
SELECT Groups.Name, COUNT(GroupsCurators.GroupId)
FROM Groups
JOIN GroupsCurators ON GroupsCurators.GroupId = Groups.Id
GROUP BY Groups.Name
HAVING COUNT(GroupsCurators.GroupId) > 1
-- чистим за собой
drop table Groups; 
drop table GroupsCurators;
Получаю план в котором сначала считается агрегат, затем вяжется с Groups.Name ("слепая картинка" получилась)



Кликните здесь для просмотра всего текста
Что я делаю не так?


Цитата Сообщение от invm Посмотреть сообщение
Нужно просто group by GroupsCurators.Id, Groups.Name
Думаю - это описка
0
668 / 291 / 120
Регистрация: 12.04.2022
Сообщений: 1,000
15.07.2022, 08:47
До кучи

T-SQL
1
select @@version;
Microsoft SQL Server 2016 (SP1-GDR) (KB4505219) - 13.0.4259.0 (X64)
0
3614 / 2135 / 756
Регистрация: 02.06.2013
Сообщений: 5,169
17.07.2022, 10:18
Цитата Сообщение от PaulWist Посмотреть сообщение
Думаю - это описка
Конечно.

Значит оптимизатор уже научили так делать. Раньше не умел.
0
668 / 291 / 120
Регистрация: 12.04.2022
Сообщений: 1,000
18.07.2022, 08:41
Цитата Сообщение от invm Посмотреть сообщение
Раньше не умел.
T-SQL
1
select @@version
Microsoft SQL Server 2008 R2 (RTM) - 10.50.1600.1 (X64) Apr 2 2010 15:48:46
Картина аналогичная (если надо, то могу приложить картинку, лень), давно умеет.

На MSSQL 6.5 проверить не могу
0
3614 / 2135 / 756
Регистрация: 02.06.2013
Сообщений: 5,169
18.07.2022, 09:12
Таки пришлось лезть вглубь

Если соединение не по уникальному столбцу (ам) - то не умеет.
0
668 / 291 / 120
Регистрация: 12.04.2022
Сообщений: 1,000
18.07.2022, 09:43
Цитата Сообщение от invm Посмотреть сообщение
Если соединение не по уникальному столбцу (ам) - то не умеет.
Не убедил

T-SQL
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
use tempdb
create table Groups (Id int /*primary key clustered*/, Name varchar); --<< Not Unique
create table GroupsCurators (ID int identity primary key, GroupId int /*foreign key references Groups(Id)*/ );
create index idx on GroupsCurators(GroupId)
 
insert into Groups values (1, '1'),(2, '2'), (1, '1'),(2, '2')
 
insert into GroupsCurators (GroupId) values (1), (1);
 
insert into GroupsCurators (GroupId) select top 100000 2 from sys.all_objects;
 
-- SET SHOWPLAN_All  Off; -- На любителя
 
SELECT Groups.Name, COUNT(GroupsCurators.GroupId)
FROM Groups
JOIN GroupsCurators ON GroupsCurators.GroupId = Groups.Id
GROUP BY Groups.Name
HAVING COUNT(GroupsCurators.GroupId) > 1
 
-- чистим за собой
drop table Groups; 
drop table GroupsCurators;
На 2008 сначала считается агрегат, затем соединение

0
3614 / 2135 / 756
Регистрация: 02.06.2013
Сообщений: 5,169
18.07.2022, 17:59
T-SQL
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
use tempdb
go
 
create table Groups (Id int primary key clustered, a int, Name varchar); --<< Not Unique
create table GroupsCurators (ID int identity primary key, GroupId int /*foreign key references Groups(Id)*/ );
create index idx on GroupsCurators(GroupId)
go
 
update statistics Groups with rowcount = 10000;
update statistics GroupsCurators with rowcount = 1000000;
go
 
set showplan_xml on;
go
 
SELECT Groups.Name, COUNT(GroupsCurators.GroupId)
FROM Groups
JOIN GroupsCurators ON GroupsCurators.GroupId = Groups.a
GROUP BY Groups.Name
HAVING COUNT(GroupsCurators.GroupId) > 1;
 
SELECT Groups.Name, COUNT(GroupsCurators.GroupId)
FROM Groups
JOIN GroupsCurators ON GroupsCurators.GroupId = Groups.a
GROUP BY Groups.Id, Groups.Name
HAVING COUNT(GroupsCurators.GroupId) > 1;
go
 
set showplan_xml off;
go
 
drop table if exists GroupsCurators;
drop table if exists Groups;
1
668 / 291 / 120
Регистрация: 12.04.2022
Сообщений: 1,000
19.07.2022, 08:44
Убедительно.

Цитата Сообщение от invm Посмотреть сообщение
Нужно просто group by GroupsCurators.Id, Groups.Name
Сию неточность первоначально не понял, что должно быть Groups.Id, Groups.Name.

Тем не менее отличный мастер-класс!
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
19.07.2022, 08:44
Помогаю со студенческими работами здесь

Файлы. Вывести на экран названия групп , где учатся 15 человек
Создайте файл, содержащий информацию об учениках:фамилию , класс, количество пропущенных часов.Найти ученика с наименьшим количеством...

Получить список групп в которых нет ни одного пользователя
Помогите, пожалуйста, не понимаю от слова совсем. Буду очень благодарен если будет код с объяснением Работа по идее для операционной...

Дан список студентов(Ф И О. группа), вывести на экран названия групп , где учатся 15 человек
Создайте файл, содержащий информацию об учениках:фамилию , класс, количество пропущенных часов.Найти ученика с наименьшим количеством...

Найти номера купе, в которых нет ни одного школьника из этих двух групп.
Две группы школьников едут в одном вагоне (в вагоне 9 купе). В массиве А хранятся номера купе школьников из первой группы, в массиве В...

Напечатать названия моделей авто, у которых максимальная скорость больше 180 км/ч
Известны максимальные скорости 20 моделей легковых автомобилей. Все значения выражены в км/ч. напечатать названия моделей, у которых...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
14
Ответ Создать тему
Новые блоги и статьи
Загрузка PNG-файла с альфа-каналом с помощью библиотеки SDL3_image на Android
8Observer8 27.01.2026
Содержание блога SDL3_image - это библиотека для загрузки и работы с изображениями. Эта пошаговая инструкция покажет, как загрузить и вывести на экран смартфона картинку с альфа-каналом, то есть с. . .
влияние грибов на сукцессию
anaschu 26.01.2026
Бифуркационные изменения массы гриба происходят тогда, когда мы уменьшаем массу компоста в 10 раз, а скорость прироста биомассы уменьшаем в три раза. Скорость прироста биомассы может уменьшаться за. . .
Воспроизведение звукового файла с помощью SDL3_mixer при касании экрана Android
8Observer8 26.01.2026
Содержание блога SDL3_mixer - это библиотека я для воспроизведения аудио. В отличие от инструкции по добавлению текста код по проигрыванию звука уже содержится в шаблоне примера. Нужно только. . .
Установка Android SDK, NDK, JDK, CMake и т.д.
8Observer8 25.01.2026
Содержание блога Перейдите по ссылке: https:/ / developer. android. com/ studio и в самом низу страницы кликните по архиву "commandlinetools-win-xxxxxx_latest. zip" Извлеките архив и вы увидите. . .
Вывод текста со шрифтом TTF на Android с помощью библиотеки SDL3_ttf
8Observer8 25.01.2026
Содержание блога Если у вас не установлены Android SDK, NDK, JDK, и т. д. то сделайте это по следующей инструкции: Установка Android SDK, NDK, JDK, CMake и т. д. Сборка примера Скачайте. . .
Использование SDL3-callbacks вместо функции main() на Android, Desktop и WebAssembly
8Observer8 24.01.2026
Содержание блога Если вы откроете примеры для начинающих на официальном репозитории SDL3 в папке: examples, то вы увидите, что все примеры используют следующие четыре обязательные функции, а. . .
моя боль
iceja 24.01.2026
Выложила интерполяцию кубическими сплайнами www. iceja. net REST сервисы временно не работают, только через Web. Написала за 56 рабочих часов этот сайт с нуля. При помощи perplexity. ai PRO , при. . .
Модель сукцессии микоризы
anaschu 24.01.2026
Решили писать научную статью с неким РОманом
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru