Отфильтровать результаты, если значение существует в любой из строк другой таблицы sql - PullRequest
1 голос
/ 10 июля 2020

Я пытаюсь подсчитать, сколько объектов появляется в таблице 2 без статуса 3 или 5. Поэтому, если он имеет статус 3 или 5, я хочу исключить его из подсчета. Где я застрял, есть повторяющиеся значения, так как у них может быть более одного статуса. Дальнейшее объяснение ниже.

Table 1

Object_ID 
1
2
3
4
5
Table 2

ID  |  object_id  |  status
1          2           2
2          2           3
3          2           5
4          3           2
5          3           2
6          3           7

КОНЕЧНАЯ ЦЕЛЬ

Подсчитайте, сколько object_ids имеют статус, исключая 3 или 5. Но также игнорировать дубликаты. В этом примере общее количество будет равно 1 (с object_id равным 3). Поскольку мне нужно найти все строки в таблице 2, затем объединить их вместе, предполагая, что ни одна из них не имеет статуса 3 или 5.

Count.   |    object_id
  1      |        3
SELECT Count(distinct(object_id))
FORM table_2
WHERE status <> 3 or status <> 5

Кажется, я могу сгруппировать их, если статус 3 или 5, но я не могу их исключить.

Надеюсь, это имеет смысл, я попытался упростить это значит, что у меня нет нерелевантного кода.

Ответы [ 2 ]

3 голосов
/ 10 июля 2020

Один из методов без подзапросов:

select count(distinct object_id) - count(distinct case when status in (3, 5) then object_id end)
from table_2;

При этом подсчитывается количество идентификаторов различных объектов, а затем вычитается количество идентификаторов отдельных объектов, имеющих указанные статусы.

Более часто, Я бы подошел к этому с двумя уровнями агрегирования:

select count(*)
from (select object_id
      from table_2
      group by object_id
      having sum( status in (3, 5) ) = 0
     ) o
1 голос
/ 10 июля 2020

Вы можете использовать агрегирование:

select count(*) 
from (
    select object_id
    from table2
    group by object_id
    having max(status in (3, 5)) = 0
) t
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...