#sql #sql-server
#sql #sql-сервер
Вопрос:
это мой пример таблицы
CREATE TABLE agentskills
(
id INT PRIMARY KEY NOT NULL IDENTITY,
skilluserid INT,
skillid INT NOT NULL,
skilltypeid INT,
priority INT DEFAULT 0
)
это мои примеры данных
INSERT INTO AGENTSKILLS (skilluserid , skillid, SKILLTYPEID,priority ) VALUES (1,21,1,1)
INSERT INTO AGENTSKILLS (skilluserid , skillid, SKILLTYPEID,priority ) VALUES (1,22,1,1)
INSERT INTO AGENTSKILLS (skilluserid , skillid, SKILLTYPEID,priority ) VALUES (2,23,1,1)
INSERT INTO AGENTSKILLS (skilluserid , skillid, SKILLTYPEID,priority ) VALUES (2,24,1,1)
INSERT INTO AGENTSKILLS (skilluserid , skillid, SKILLTYPEID,priority ) VALUES (3,21,1,1)
INSERT INTO AGENTSKILLS (skilluserid , skillid, SKILLTYPEID,priority ) VALUES (3,22,1,1)
Здесь ‘skilluserid’ — это идентификатор пользователя, обладающего навыком ‘skillid’
как я могу получить users / skilluserid с комбинацией skillid ?
например: получить пользователя (пользователей), имеющего skillid 21 и 22 или 22 и 21 или 21,22,23. любая комбинация, имеющая 21 и 22.
Ответ №1:
Вы можете использовать агрегацию и having
:
select skilluserid
from agentskills
where skillid in (21, 22)
group by skilluserid
having count(distinct skillid) = 2; -- "2" = size of list in where clause
Ответ №2:
вы можете использовать exist, если вам нужны все столбцы в выборе
select t1.* from agentskills t1
where exists ( select 1 from agentskills t2 where t1.skilluserid=t2.skilluserid
and skillid in (21, 22)
having count(distinct skillid) = 2
) and skillid in (21, 22)
Ответ №3:
Вы можете использовать intersect,
select skilluserid
from agentskills
where skillid =21
INTERSECT
select skilluserid
from agentskills
where skillid =22
Комментарии:
1. работает, когда необходимо сопоставить 2 навыка. если я попытаюсь сопоставить 21,22 и 23, это не удастся. но я рад узнать INTERSECT. Я мог бы использовать ее в другом месте, чтобы упростить несколько задач. Спасибо!