PostgreSQL ВО всех

#sql #postgresql #relational-division

#sql #postgresql #реляционное разделение

Вопрос:

У меня следующая структура таблицы:

 | id | object_id | status_id |
------------------------------
| 1  |     12    |     1     |
| 2  |     12    |     2     |
| 3  |     18    |     5     | 
 

Мне нужно выбрать все object_id , которые были в статусе 1 и 2. То есть что-то вроде этого: select object_id from table_name where status_id in (1, 2) , но мне нужно status_id быть не в одном из перечисленных значений, а точно в обоих. То есть из приведенной выше таблицы я должен вернуть значение 12 (причина object_id в том, что статусы равны 12). Как это можно сделать?

Комментарии:

1. Почему это должно быть 12? 1 находится в наборе (1, 2)

2. @Andronicus Мне нужно получить object_id объект, в котором есть записи со статусами 1 и 2, поэтому он возвращает 12. Я привел пример с sql in для наглядности

3. Вы хотите иметь те объекты, которые имеют именно эти два значения состояния или, по крайней мере , эти два значения?

4. @a_horse_with_no_name именно эти два

Ответ №1:

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

 select object_id
from the_table
group by object_id
having bool_and(status_id in (1,2))
   and count(distinct status_id) = 2
 

Онлайн-пример

Ответ №2:

 select object_id 
from table_name 
where status_id in (1, 2)
group by object_id 
having count(distinct status_id) = 2
 

Ответ №3:

Если вам просто нужен уникальный идентификатор объекта из состояния 1 или 2, вы можете использовать distinct ключевое слово.:

 select distinct object_id from table_name where status_id in (1, 2)
 

Комментарии:

1. Это возвращает неверный результат dbfiddle.uk /…

2. он возвращает object_id, если статус равен 1 или два. Я упомянул об этом в своем ответе. если желаемый ответ — иметь отдельный object_id, который имеет как 1, так и 2 в поле состояния, то группировать по — это простое решение.