PostgreSQL 相当于 Pandas 外部合并
PostgreSQL equivalent of Pandas outer merge
我正在尝试在 Postgres 中执行相当于 Pandas 外部合并的操作,以便外部合并两个表。
Table df_1
包含这些数据:
Table df_2
包含这些数据:
所以 Table df_1
比 df_2
多一列 (random_id
)。此外,job_id 1711418 和 worker_id 45430 存在于 df_1
和 df_2
中。
如果我在Pandas中使用“外部合并”方法:
df_1.merge(df_2, on=['job_id', 'worker_id'], how='outer')
,我会得到如下所示的理想结果:
但是,我找不到 SQL (postgres) 与 Pandas 外部合并方法等效的方法。
我试过运行以下查询:
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
但是,结果生成了 2 个额外的重复列,称为 job_id_duplicate_column_name_1
和 worker_id_duplicate_column_name_1
,我不希望这样:
谁能帮忙推荐一个可以实现与Pandas中的外部合并方法相同的查询方法?
对我来说这看起来像是 UNION,而不是 JOIN:
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)
并集的第二部分 returns df_2
中不存在于 df_1
中的所有行
另一种方法是使用 EXCEPT
从 df_2 中获取 df_1
中不存在的行
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
我正在尝试在 Postgres 中执行相当于 Pandas 外部合并的操作,以便外部合并两个表。
Table df_1
包含这些数据:
Table df_2
包含这些数据:
所以 Table df_1
比 df_2
多一列 (random_id
)。此外,job_id 1711418 和 worker_id 45430 存在于 df_1
和 df_2
中。
如果我在Pandas中使用“外部合并”方法:
df_1.merge(df_2, on=['job_id', 'worker_id'], how='outer')
,我会得到如下所示的理想结果:
但是,我找不到 SQL (postgres) 与 Pandas 外部合并方法等效的方法。
我试过运行以下查询:
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
但是,结果生成了 2 个额外的重复列,称为 job_id_duplicate_column_name_1
和 worker_id_duplicate_column_name_1
,我不希望这样:
谁能帮忙推荐一个可以实现与Pandas中的外部合并方法相同的查询方法?
对我来说这看起来像是 UNION,而不是 JOIN:
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)
并集的第二部分 returns df_2
中不存在于 df_1
另一种方法是使用 EXCEPT
从 df_2 中获取 df_1
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