Оператор AND между таблицами, когда обе имеют несколько записей (проверка нескольких строк на несколько строк) - PullRequest
0 голосов
/ 30 марта 2020

У меня есть три таблицы [AvailableEmployees], [AvailableAttributesTemp] и [EmployeeAttributeMapping].

[AvailableEmployees]

Id       Name
1000     Employee 1
1001     Employee 2
1002     Employee 3
1003     Employee 4
1004     Employee 5

[AvailableAttributesTemp] временная таблица может иметь больше строк

Id  AttributeName
1   HRA
3   DA

[EmployeeAttributeMapper]

EmployeeId  AttributeId    
1000        1
1000        3
1001        1
1002        1
1002        3
1003        1
1004        4

Я хочу получить только EmployeeId, которые имеют все атрибуты из [AvailableAttributesTemp] (HRA и DA оба, хотя могут быть более двух атрибутов в списке), поэтому любой запрос для получения 1000, 1002.

Я написал запрос, используя оператор IN, который возвращает 1000, 1001, 1002, 1003. Теперь пытаюсь обновить запрос, чтобы использовать оператор AND для отфильтровать сотрудника, пробовал EXISTS, присоединиться, хотя каким-то образом не смог получить желаемый результат.

Этот сценарий является частью большого SP с несколькими временными таблицами и более 500 строк / с запросов.

Любая помощь будет оценена. Спасибо

1 Ответ

2 голосов
/ 30 марта 2020

Вы должны иметь возможность просто выбрать все идентификаторы сотрудников из EmployeeAttributeMapper, где число AttributeId для этого сотрудника совпадает с количеством всех строк из AvailableAttributesTemp:

SELECT EmployeeID
FROM EmployeeAttributeMapper
GROUP BY EmployeeID
HAVING COUNT(DISTINCT AttributeId) = (SELECT COUNT(*) FROM AvailableAttributesTemp)

Вывод:

EmployeeID
1000
1002

Демонстрация по SQLFiddle

Примечание. Я включил DISTINCT в COUNT из AttributeID на случай возможного дублирования записи в EmployeeAttributeMapper. Если это не так, вы можете удалить DISTINCT из этой части запроса.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...