#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. Я привел пример с sqlin
для наглядности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 в поле состояния, то группировать по — это простое решение.