连接两个具有相同键但不同字段的表

Posted

技术标签:

【中文标题】连接两个具有相同键但不同字段的表【英文标题】:Joining two tables with same keys but different fields 【发布时间】:2021-07-14 14:51:56 【问题描述】:

我有两个表都具有相同的字段除了一个。我想将这两个表与结果表结合起来,结果表中包含两个表中的所有字段,包括每个表中不同的两个字段。即:

假设我有带有架构的表 order_debit

order_id, date_of_order, debit_balance

5, 2019, 100
2, 2021, 30

和表 order_credit 与架构

order_id, date_of_order, credit_balance

1,2020, 35
2,2021, 40

我想要的是带有架构的决赛桌

order_id, date_of_order, credit_balance, debit_balance

5, 2019, 100, 0
2, 2021, 30, 40
1, 2020, 0, 35

我无法弄清楚如何在没有重复值的情况下进行连接,我认为 order_ids 不会有太多重叠,但肯定会有一些。

【问题讨论】:

【参考方案1】:

对于 mysql,您可以使用 UNION ALLGROUP BY

SELECT
    order_id, date_of_order, SUM(credit_balance), SUM(debit_balance)
FROM 
(
    SELECT order_id, date_of_order, 0 AS credit_balance, debit_balance FROM tbl_debit
    UNION ALL
    SELECT order_id, date_of_order, credit_balance, 0 AS debit_balance FROM tbl_credit
) FROM t
GROUP BY order_id, date_of_order

【讨论】:

【参考方案2】:

full join需要和coalesce一起使用

select
  coalesce(t1.order_id, t2.order_id) as order_id,
  coalesce(t1.date_of_order, t2.date_of_order) as date_of_order,
  coalesce(t1.debit_balance, 0) as debit_balance,
  coalesce(t2.credit_balance, 0) as credit_balance
from t1 
  full join t2
    on t1.order_id=t2.order_id

【讨论】:

【参考方案3】:

基本上你想要一个full join,这是 MySQL 不支持的。一个方便的方法是:

select od.order_id, od.date_of_order, od.debit_balance,
       coalesce(oc.credit_balance, 0) as credit_balance
from order_debit od left join
     order_credit oc
     using (order_id, date_of_order)
union all
select oc.order_id, oc.date_of_order, 0, oc.credit_balance
from order_credit oc
where not exists (select 1
                  from order_debit od
                  where od.order_id = oc.order_id and od.date_of_order = oc.date_of_order
                 );

【讨论】:

你是对的@GordonLinoff,full join 功能不被mysql支持,我的错...

以上是关于连接两个具有相同键但不同字段的表的主要内容,如果未能解决你的问题,请参考以下文章

如何在 LINQ sql 中将两个表与一个具有不同值的表连接起来?

JOOQ 连接两个具有相同列名的表

连接来自两个不同表的两列

从两个表中,把不同类型的字段查询连接在一起

当您连接 2 个具有相同架构的表并检查除一个以外的所有字段是不是相等时,如何避免在 SQL 中编写冗长的 where 子句?

打字稿:创建具有相同键但不同值的对象