PostgreSQL等价于外部合并

PostgreSQL等价于外部合并,sql,pandas,postgresql,merge,outer-join,Sql,Pandas,Postgresql,Merge,Outer Join,我试图在Postgres中做与Pandas外部合并等效的操作,以便外部合并两个表 表df_1包含以下数据: 表df_2包含以下数据: 因此表df_1比df_2有一个额外的列random_id。此外,df_1和df_2中都存在job_id 1711418和worker_id 45430 如果我在Pandas中使用外部合并方法: df_1.mergedf_2,on=['job_id','worker_id',how='outer',我会得到理想的结果,如下所示: 但是,我找不到与该合并方法相当的SQ

我试图在Postgres中做与Pandas外部合并等效的操作,以便外部合并两个表

表df_1包含以下数据:

表df_2包含以下数据:

因此表df_1比df_2有一个额外的列random_id。此外,df_1和df_2中都存在job_id 1711418和worker_id 45430

如果我在Pandas中使用外部合并方法: df_1.mergedf_2,on=['job_id','worker_id',how='outer',我会得到理想的结果,如下所示:

但是,我找不到与该合并方法相当的SQLPostgres

我已尝试运行以下查询:

select *
from df_1
full outer join df_2
   on df_1.job_id = df_2.job_id 
  and df_1.worker_id = df_2.worker_id
但是,结果生成了两个额外的重复列,分别称为job_id_duplicate_column_name_1和worker_id_duplicate_column_name_1,这是我不想要的:


有谁能帮我推荐一种查询方法,它可以实现与Pandas中的外部合并方法相同的效果吗?

这在我看来像是一个联合,而不是联接:

select job_id, worker_id, random_id
from df_1
union all
select job_id, worker_id, 'NaN'
from df_2 d2
where not exists (select *
                  from df_1 d1
                  where d1.job_id = d2.job_id
                    and d1.worker_id = d2.worker_id)
联合的第二部分返回df_2中df_1中不存在的所有行

另一种方法是使用EXCEPT从dfu 2中获取dfu 1中不存在的行


样本数据最好以如下方式表示。有关如何创建美观的表的一些提示,请参阅。默认的合并/连接是自然的SQL连接。在使用功能之前,请阅读文档。这是否回答了您的问题@philipxy,自然连接在我的情况下不起作用,因为它只在匹配的记录上连接。在我的用例中,有一些记录在df_1和df_2之间是不同的,我想在结果中保留它们。我是指自然完全连接。我没有注意到,我发现的问答只是针对自然内部与普通内部,而不是针对自然与普通内部与外部。表的特殊情况意味着您可以进行自然右连接。您还需要将空值映射到NaN。在特殊情况和NaN之间,您可能希望在接受的答案中使用UNION等。我专注于自然与朴素;我现在不确定这是你真正想要的结果。请注意。谢谢没有名字的马!你的建议如期发挥作用。我将花一些时间来学习更多关于这种方法的知识。
select job_id, worker_id, random_id
from df_1
union all
select job_id, worker_id, 'NaN'
from 
(
  select job_id, worker_id
  from df_2 d2
  except
  select job_id, worker_id
  from df_1
) t