Давайте начнем с того, что не так. Вы пытаетесь найти строку, в которой оба "TagsObjects". "Tob_object" = 8 и "TagsObjects". "Tob_object" = 9. "TagsObjects". "Tob_object" не могут быть одновременно одновременно, поэтому не могут быть возвращены никакие строки ,
Что тебе тогда делать?
Из вашей спецификации я понял, что есть несколько пар ("TagsObjects". "Tob_object", "TagsObjects". "Tob_objectType"), где ни одно из полей не является константой. Вы хотите создать объединение всех строк, которые возвращаются для каждой пары.
WITH matchingTagsObjects AS (
SELECT "TagsObjects"."tob_tag"
FROM "TagsObjects"
WHERE ("TagsObjects"."tob_object" = 8 AND "TagsObjects"."tob_objecttype" = 1)
UNION ALL
SELECT "TagsObjects"."tob_tag"
FROM "TagsObjects"
WHERE ("TagsObjects"."tob_object" = 9 AND "TagsObjects"."tob_objecttype" = 1)
)
SELECT "TagsObjects"."tob_tag"
FROM matchingTagsObjects
GROUP BY "TagsObjects"."tob_tag";
Именованный подзапрос matchTgsObjects перечисляет все теги tob_tags, найденные для пар (8,1) и (8,2). Фактические теги выбираются в основном запросе, а отдельные теги tob_tags выбираются с помощью предложения group by, как и в вашем решении. Я использовал UNION ALL, потому что группировка выполняется в основном запросе, и я не нашел причин для удаления дублирующих строк в подзапросе на этом этапе. Вы можете достичь этого, исключив ALL из UNION ALL.
Вы также можете включить подзапрос непосредственно в часть from вместо использования именованного подзапроса.
Существует также альтернатива, в которой вы используете условия OR в предложении where, как в WHERE (соответствует паре A) OR (соответствует паре B). Мой коллега стал бы баллистиком, если бы увидел, что используется: когда для сопоставления в этом сценарии требуется ИЛИ, это говорит о том, что с реальной моделью можно что-то сделать.