连接两个具有相同键但不同字段的表
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 ALL
和 GROUP 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 中将两个表与一个具有不同值的表连接起来?
当您连接 2 个具有相同架构的表并检查除一个以外的所有字段是不是相等时,如何避免在 SQL 中编写冗长的 where 子句?