Отфильтровать результат запроса по нескольким записям - PullRequest
0 голосов
/ 09 апреля 2019

У меня есть база данных Access с таблицей Table1, которая содержит следующую информацию:

ADDRESS_ID | CATEGORY_ID
1          | 12
2          | 41
2          | 66
3          | 41
4          | 41
4          | 66

Каждый ADDRESS_ID принадлежит выделенному клиенту (назначается однозначно).

Мне нужно создатьSQL-запрос, который возвращает только те строки таблицы, для которых ADDRESS_ID имеет ровно ОДНУ выделенную запись, например, если мой критерий фильтрации «Return CATEGORY_ID = 41», ожидаемый результат:

ADDRESS_ID | CATEGORY_ID
3          | 41

или если онis «Return CATEGORY_ID = 66», результатом является пустая таблица.

Как реализовать запрос без выполнения постобработки скриптом?

Ответы [ 4 ]

1 голос
/ 09 апреля 2019

Я бы использовал group by и having:

select address_id
from table1
group by address_id
having min(category_id) = max(category_id) and
       min(category_id) = 41;

Вы можете добавить 41 as category_id к select, если хотите, но вы уже знаете это.

Еслив таблице нет повторяющихся пар, вы также можете сформулировать это следующим образом:

select address_id
from table1
group by address_id
having count(*) = 1 and
       min(category_id) = 41;
0 голосов
/ 09 апреля 2019

Я бы использовал NOT EXISTS:

select t.*
from table as t
where CATEGORY_ID = 66 and
      not exists (select 1 
                  from table as t1 
                  where t1.ADDRESS_ID = t.ADDRESS_ID and t1.CATEGORY_ID <> t.CATEGORY_ID
                 );
0 голосов
/ 09 апреля 2019

Этот запрос:

select address_id, max(category_id) category_id
from tablename
group by address_id
having min(category_id) = max(category_id)

возвращает:

только те строки таблицы, для которых ADDRESS_ID имеет ровно ОДНУ выделенную запись

Теперь вы можете применить к нему любой фильтр и получить желаемый результат:

select t.* from (
    select address_id, max(category_id) category_id
    from tablename
    group by address_id
    having min(category_id) = max(category_id)
) t
where t.category_id = 41
0 голосов
/ 09 апреля 2019

Использование count() и having:

SELECT
    ADDRESS_ID,
    CATEGORY_ID
FROM
    Table1
WHERE
    CATEGORY_ID=41
GROUP BY
    ADDRESS_ID,
    CATEGORY_ID
HAVING
    Count(*) = 1
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...