Поиск 2 postgres array_agg, чтобы найти тот же элемент (ы) - PullRequest
0 голосов
/ 14 июня 2019

У меня есть 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

1 Ответ

0 голосов
/ 14 июня 2019

Хорошо, сразу после того, как я набрал этот вопрос, я нашел ответ.Я проверил это, и оно работает.

Так что для всех, кто хочет сделать это, используя 1 оператор, вот оно.

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);

@> содержит

https://www.postgresql.org/docs/11/functions-array.html

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...