Так что здесь происходит то, что pg_indexes имеет 4 строки, соответствующие вашим условиям WHERE.Когда вы оставляете соединение, вы сохраняете все строки, даже если нет соединения.В вашем случае к pg_constraint присоединяется только одна строка.
Когда LEFT JOIN не удается соединить строку, он заполняет все потенциальные столбцы значением NULL.Это означает, что в вашем случае 3 строки, которые не присоединились к pg_constraint, теперь имеют NULL для всех столбцов, указанных в pg_constraint.
Наконец, когда вы сравниваете ____ <> 'p', вы пропускаетеправило того, как SQL обрабатывает значения NULL.NULL рассматривается как отсутствие значения, а не как что-то, с чем вы можете сравнить.Любая попытка использовать скалярное сравнение потерпит неудачу.
Вы можете исправить это, изменив значение на WHERE (pc.contype IS NULL OR pc.contype <> 'p')