#sql #postgresql #nested #pid
#sql #postgresql #вложенный #pid
Вопрос:
Я пытаюсь получить имена пользователей блокирующего и заблокированного пользователя, но получаю массив null.
Это то, что я пробовал:
select pid,
usename,
pg_blocking_pids(pid) as blocked_by, (select usename from
pg_stat_activity where pid=ANY(pg_blocking_pids(pid)))
from pg_stat_activity
where cardinality(pg_blocking_pids(pid)) > 0;
Этот вложенный выбор возвращает [null].
Дело в том, что если я запрашиваю этот выбор, вставляя вручную значение pid следующим образом
select usename from pg_stat_activity where pid=ANY(pg_blocking_pids(14648));
Я получаю значение, которое я ищу.
Ответ №1:
Я думаю, вам нужно предложение о корреляции:
select sa.pid, sa.usename,
pg_blocking_pids(sa.pid) as blocked_by,
(select sa2.usename
from pg_stat_activity sa2
where sa2.pid = ANY(pg_blocking_pids(sa.pid)))
from pg_stat_activity sa
where cardinality(pg_blocking_pids(sa.pid)) > 0;
Вы узнаете, что это работает, если получите сообщение об ошибке, в котором указано, что подзапрос возвращает более одной строки. В этом случае добавьте array_agg()
в подзапрос.
Комментарии:
1. Вы можете использовать
array(select sa2.usename ...)
для возврата всех имен пользователей в виде массива