получить запись, содержащую комбинацию столбцов

#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. Я мог бы использовать ее в другом месте, чтобы упростить несколько задач. Спасибо!