У меня есть 2 array_agg, "критерии поиска" и "список всех":
Коды, которые я использую для получения array_agg:
"критерии поиска"
SELECT ARRAY_AGG(DISTINCT n_id) as agg_n FROM pn WHERE n_id IN (100,101)
Результат:
{100,101}
«список всех»
SELECT p_id, ARRAY_AGG(DISTINCT n_id) AS agg_n_2 FROM pn GROUP BY p_id
Результат:
1 | {100,101}
2 | {100,101,102}
3 | {100,102}
4 | {101,103}
5 | {100,101,102,103}
Подзапросы работают хорошо и хорошо.Если я прошу его вернуть все p_id, который имеет n_id и 100 И 101 (согласно запросу).Он вернет 1
только тогда, когда должен вернуть 1,2,5
.Если мой запрос был просто {100}
, он ничего не вернет, и мне нужно, чтобы он возвратил 1,2,3,5
Полный SQL приведен ниже.Как я могу делать то, что мне нужно?Я знаю, что первые 2 подзапроса выше должны быть правильными, но как мне структурировать общий запрос?
WITH pn_o AS (SELECT p_id, ARRAY_AGG(DISTINCT n_id) AS agg_n FROM pn GROUP BY p_id),
n_o AS (SELECT ARRAY_AGG(DISTINCT n_id) as agg_n_2 FROM pn WHERE n_id IN (100))
SELECT p_id FROM pn WHERE pn_o.agg_n = (SELECT n.agg_n_2 FROM n_o);
Я пробовал = и пробовал IN (который выдает ошибку).Я не могу использовать ЛЮБОЙ, потому что это не критерий ИЛИ, а AND.
Пример таблицы pn (в ней всего 2 столбца, а n_id и p_id - разные внешние ключи):
p_id | n_id
-----+-----
100 | 100
100 | 101
100 | 102
100 | 103
101 | 100
101 | 102
101 | 105
То, что я пытаюсь найти, - это p_id, который связан с n_id, будь то 1 или более n_ids.
Если есть лучшее утверждение, которое я могу использовать, оно было бы также замечательно.
Спасибо.Desmond