powered by simpleCommunicator - 2.0.59     © 2025 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Проектирование БД [игнор отключен] [закрыт для гостей] / Помогите, пожалуйста, новичку SQL-запрос
7 сообщений из 7, страница 1 из 1
Помогите, пожалуйста, новичку SQL-запрос
    #38563383
SQL31_T
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Привет. Помогите, пожалуйста, в написании запроса. Я изучаю SQL уже две недели. Над этим запросом неделю думал, не получается.

Дано: есть таблица PCProg. В этой таблице есть два столбца:

user_id - уникальный идентификатор пользователей компьютером. В столбце значения u1, u2, u3, ... и т.д.

appl_id - идентификатор приложений (программ), которыми могут пользоваться пользователи. В столбце значения pr1, pr2, ... и т.д.

Каждый пользователь имеет право пользоваться определенным набором (количеством) программ. Есть пользователи, которые имеют право пользоваться всеми программами. Любой пользователь имеет право пользоваться хотя бы одной программой.

Условно выглядит так:
u1: pr1, pr2, pr5, pr6
u2: pr2, pr7, pr9
u3: имеет право пользоваться всеми программами
.
.
.
u5: pr4
.
. и т.д.

Нужно написать запрос, который отобразит всех пользователей, которые имеют право пользоваться всеми программами.
...
Рейтинг: 0 / 0
Помогите, пожалуйста, новичку SQL-запрос
    #38563416
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
SQL31_TНад этим запросом неделю думал, не получается.
У этой задачи как минимум два решения:
1) отобразить пользователей, у которых нет запрещённых к применению программ
2) отобразить пользователей, у которых число разрешённых к применению программ совпадает с
числом программ вообще.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
Помогите, пожалуйста, новичку SQL-запрос
    #38563446
SQL31_T
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Спасибо, за быстрый ответ. Но я не понял предложенных решений. Что нужно найти в задаче я понимаю. Только не могу понять как это выразить через запрос.

Все виды приложений можно найти с помощью:

SELECT DISTINCT appl_id
FROM PCProg

Если бы вышеизложенный запрос можно было бы использовать, то задача была бы решена. Но использование ключевого слова IN здесь не подойдёт.

Не подходит запрос вида:

SELECT user_id
FROM PCProg
WHERE appl_id IN (SELECT DISTINCT appl_id
FROM PCProg)

Я уверен, что это типовая задача. Но пока не нашёл аналогичную.
...
Рейтинг: 0 / 0
Помогите, пожалуйста, новичку SQL-запрос
    #38563480
Edgar
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
SQL31_T,

Попробуй так:

Код: plsql
1.
2.
3.
select user_id, count(*) from PCProg
group by user_id
having count(*) = (select count(distinct appl_id ) from PCProg)
...
Рейтинг: 0 / 0
Помогите, пожалуйста, новичку SQL-запрос
    #38563638
SQL31_T
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Огромное спасибо, Edgar. Твой запрос работает. Проверил с помощью LibreOffice Base.

Сам я осваиваю SQL с помощью QT ODBC 6.1.9.56 ( Query Tool by George Poulose). C помощью Query Tool работаю с .mdb Access файлом. Но Microsoft Access не поддерживает использование аргумента DISTINCT в статистических функциях. Поэтому и твой запрос выдал ошибку.

Погуглил, нашёл советы на http://stackoverflow.com. Пробовал модифицировать запрос под Microsoft Access. Не вышло. Решил время не терять и попробовать через LibreOffice Base.
...
Рейтинг: 0 / 0
Помогите, пожалуйста, новичку SQL-запрос
    #38563679
Фотография MasterZiv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
SQL31_TПривет. Помогите, пожалуйста, в написании запроса. Я изучаю SQL уже две недели. Над этим запросом неделю думал, не получается.

Дано: есть таблица PCProg. В этой таблице есть два столбца:

user_id - уникальный идентификатор пользователей компьютером. В столбце значения u1, u2, u3, ... и т.д.

appl_id - идентификатор приложений (программ), которыми могут пользоваться пользователи. В столбце значения pr1, pr2, ... и т.д.

Каждый пользователь имеет право пользоваться определенным набором (количеством) программ. Есть пользователи, которые имеют право пользоваться всеми программами. Любой пользователь имеет право пользоваться хотя бы одной программой.

Условно выглядит так:
u1: pr1, pr2, pr5, pr6
u2: pr2, pr7, pr9
u3: имеет право пользоваться всеми программами
.
.
.
u5: pr4
.
. и т.д.

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


Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
select distinct user_id
from PCProg r
join (select distinct appl_id from PCProg) r3 on 1=1  -- можно использовать CROSS JOIN если СУБД позволяет
where not exists ( select * 
                         from PCProg r1
                         where r1.user_id = r.user_id
                             and r1.appl_id = r3.appl_id
                       )




Или так:

Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
select distinct user_id
from PCProg r
where not exists ( select * 
                         from PCProg r1
                         where r1.user_id = r.user_id
                            and exists ( select * from PCProg r2
                                             where r2.user_id <> r1.user_id
                                                 and r2.appl_id = r1.appl_id
                       )
...
Рейтинг: 0 / 0
Помогите, пожалуйста, новичку SQL-запрос
    #38563680
Фотография MasterZiv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
SQL31_TЯ уверен, что это типовая задача. Но пока не нашёл аналогичную.

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


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