#sql #sql-server #database
#sql #sql-сервер #База данных
Вопрос:
У меня есть таблица в SQL Server.Вот как данные хранятся в настоящее время в таблице:
Я хочу получить все общие menu_id, когда предоставлено несколько role_id. Например: я хочу, чтобы menu_id 1, когда указаны role_id, были равны 1 и 3, поскольку menu_id 1 является общим для всех указанных role_id. Я понятия не имею, какой запрос мне следует использовать. Кто-нибудь может мне помочь?
Заранее спасибо!
Комментарии:
1. Может быть, я, но это утверждение не имеет смысла. В чем заключается ваш вопрос здесь (вы только сказали нам, что вы хотите, ничего не спрашивали). Что вы пробовали до сих пор, и почему это не сработало? Каковы ваши ожидаемые результаты?
2. Большинству пользователей здесь нужны образцы табличных данных — и ожидаемый результат — в виде форматированного текста, а не в виде изображений.
Ответ №1:
Кажется, вам нужны menu_id
файлы, которые имеют список role_id
значений. Это должно делать то, что вы хотите:
select menu_id
from t
where role_id in (1, 3)
group by menu_id
having count(*) = 2; -- number of values in IN list
Здесь используется db<>fiddle .
Ответ №2:
используйте group by
с having
select menu_id from tablename
group by menu_id
having count(distinct role_id)>1
Комментарии:
1.Ваш ответ правильный, вы просто пропустили требование выбора определенных идентификаторов ролей. Просто добавьте
where role_id in (1,3)
sqlfiddle.com /#!18/87764/22. Нет необходимости использовать
distinct
, вполне вероятно, что таблица спроектирована правильно, то есть составная часть role_id menu_id имеет уникальный / первичный ключ. Скажем, для данного menu_id, равного 42, для него не было бы повторяющегося role_id, в таблице не было бы этих повторяющихся значений (7, 42), (7, 42). Итак,distinct
не требуется