Полностью квалифицируйте все свои столбцы, даже подумайте о переименовании, чтобы они были уникальными:
SELECT dat_serial_id, tr_serial_id, dat_contact_note, tr_contact_note
FROM (
SELECT
"DAT"."P_SERIAL_ID" as dat_serial_id,
"TR"."P_SERIAL_ID" as tr_serial_id,
"DAT"."CONTACT_NOTE" as dat_contact_note,
"TR"."CONTACT_NOTE" as tr_contact_note,
"SUBID"."SUBJECT_CITIZEN_ID" --guessed at the table
FROM "B_TRACE"."P_TC_DATA" AS DAT
FULL OUTER JOIN "B_COLLECTION"."COLLECTION_CONSENT_RC" AS SUBID ON DAT."P_SERIAL_ID" = SUBID."SUBJECT_ID"
FULL OUTER JOIN "B_TRACE"."P_TC_RC" AS TR ON TR."P_SERIAL_ID" = DAT."P_SERIAL_ID"
WHERE DAT."STATE_ID" IN ('7','8','9')
) AS SHIT0
WHERE shit0."SUBJECT_CITIZEN_ID" IS NOT NULL;
Переименуйте их как можно раньше, чтобы избежать ошибок и путаницы при использовании неправильного.Если вам не нужны все разные serial_no и т. Д., То, если вы определите, какой из них вы хотите во внутреннем запросе, вы можете продолжать ссылаться на него с тем же именем во внешнем запросе
Проблема в основном возникает из-за SELECT *
- избегайте его использования ни для чего, кроме запросов верхнего уровня, для отладки
Использование предложения WHERE для любой таблицы с полным объединением уменьшает соединение влево /Право присоединиться.Если таблица, в которой вы находились WHERE, находится справа / слева от левого / правого соединения, соответственно отбрасывает это во внутреннее соединение:
--same as a left join b
SELECT * FROM a FULL JOIN B ON … WHERE a.id = 1
--same as a right join b
SELECT * FROM a FULL JOIN B ON … WHERE b.id = 1
--same as a inner join b
SELECT * FROM a LEFT JOIN B ON … WHERE a.id = 1
SELECT * FROM a RIGHT JOIN B ON … WHERE b.id = 1