为什么PostgreSQL抛出"FULL JOIN仅支持merge-joinable或hash-joinable join条件"

Ben*_*son 4 postgresql join

尝试使用OR条件连接2个表,如下所示:

FULL JOIN table1
     ON (replace(split_part(table1.contract_award_number::text, ' '::text, 2), '-'::text, ''::text)) = table2.contract_award_id 

     OR (btrim(replace(table1.solicitation_number::text, '-'::text, ''::text))) = table2.solicitation_id
Run Code Online (Sandbox Code Playgroud)

但是Postgresql对我大吼大叫:

FULL JOIN is only supported with merge-joinable or hash-joinable join conditions
Run Code Online (Sandbox Code Playgroud)

是什么赋予了?出于某种原因,如果我添加条件:

WHERE table1.solicitation_number::text ~~ '%%'::text 
Run Code Online (Sandbox Code Playgroud)

错误没有发生,但我怀疑这是结果FULL JOIN结果.

谢谢你的帮助.

Tim*_*sen 7

应该可以使用以下查询模拟两个表之间的任何完全外部联接:

SELECT * FROM t1
LEFT JOIN t2 ON t1.id = t2.id
UNION ALL
SELECT * FROM t1
RIGHT JOIN t2 ON t1.id = t2.id
WHERE t1.id IS NULL
Run Code Online (Sandbox Code Playgroud)

联合的前半部分获取第一个表独有的记录以及所有重叠记录.工会的后半部分仅获得第二张表的记录.将此模式应用于您的查询会给出:

SELECT column1, column2, column3
FROM fpds_opportunities fpds
LEFT JOIN fbo_all_opportunity_detail fbo
    ON replace(split_part(fbo.contract_award_number::text, ' '::text, 2), 
               '-'::text, ''::text) = fpds.contract_award_id OR
       btrim(replace(fbo.solicitation_number::text, '-'::text, ''::text)) = fpds.solicitation_id
UNION ALL
SELECT column1, column2, column3
FROM fpds_opportunities fpds
RIGHT JOIN fbo_all_opportunity_detail fbo
    ON replace(split_part(fbo.contract_award_number::text, ' '::text, 2), 
               '-'::text, ''::text) = fpds.contract_award_id OR
       btrim(replace(fbo.solicitation_number::text, '-'::text, ''::text)) = fpds.solicitation_id
WHERE
    fpds.contract_award_id IS NULL AND fdps.solicitation_id IS NULL;
Run Code Online (Sandbox Code Playgroud)