Как говорится в сообщении об ошибке, Postgres поддерживает только условия соединения для FULL [OUTER] JOIN
, которые можно использовать при объединении слиянием или при sh -соединении. t.code LIKE file
не подходит для этого.
Это известное ограничение. Просто не было достаточно интереса для редкого случая, чтобы мотивировать исправление. См .:
Однако в ваших вопросах ничего не говорится о том, что вам действительно нужно LIKE
:
Мне нужно знать, какие коды существуют в массиве и отсутствуют в таблице. А также какие коды существуют в таблице и отсутствуют в массиве.
Это указывало бы на равенство (=
) - что отлично работает:
SELECT file, t.code AS acc_missing
FROM unnest('{10001517,1509,1524,155400X,903B,910,1009201X}'::text[]) file
FULL join table_a t ON t.code = file -- !
WHERE t.code IS NULL
OR file IS NULL AND t.version LIKE '010' AND t.inst = 300;
Способ Вы отформатировали запрос указывает, что вы хотите, чтобы круглые скобки около (t.code IS NULL OR file IS NULL)
. AND
связывается до OR
. Руководство по приоритету оператора .
OTOH, добавленные предикаты AND t.version LIKE '010' AND t.inst = 300
имеют смысл только без скобок. Итак, вот обходной путь, реализующий ваш исходный запрос с LEFT
& RIGHT JOIN
:
SELECT file, t.code AS acc_missing
FROM unnest('{10001517,1509,1524,155400X,903B,910,1009201X}'::text[]) file
LEFT JOIN table_a t ON t.code LIKE file
WHERE t.code IS NULL
UNION ALL
SELECT file, t.code AS acc_missing
FROM unnest('{10001517,1509,1524,155400X,903B,910,1009201X}'::text[]) file
RIGHT JOIN table_a t ON t.code LIKE file
WHERE file IS NULL AND t.version LIKE '010' AND t.inst = 300;
Или:
SELECT file, t.code AS acc_missing
FROM unnest('{10001517,1509,1524,155400X,903B,910,1009201X}'::text[]) file
LEFT JOIN table_a t ON t.code LIKE file
WHERE t.code IS NULL
UNION ALL
SELECT NULL, t.code
FROM table_a t
WHERE (t.code LIKE ANY ('{10001517,1509,1524,155400X,903B,910,1009201X}'::text[])) IS NOT TRUE;
db <> fiddle здесь