gpt4 book ai didi

sql - 如何将具有相同主键的多个表连接到一个每个键一行的表?

转载 作者:行者123 更新时间:2023-12-02 02:05:49 26 4
gpt4 key购买 nike

我有什么

我有多个带有主键的表 key和一个值。每个键可能存在于所有表中或仅存在于表的子集中。

以下是示例表格:

选项卡1:

<表类=“s-表”><标题>键值 <正文>A1C3

选项卡2:

<表类=“s-表”><标题>键值 <正文>A10D10

标签3:

<表类=“s-表”><标题>键值 <正文>B20D10

我想要什么

我想以这样一种方式连接表,即为每个现有键获取一行,为每个表获取一列。如果某个表中不存在某个键,null应该假设。因此,对于上面的示例,我想得到这个结果:

<表类=“s-表”><标题>键tab1tab2tab3 <正文>A110NULLBNULLNULL20C3NULLNULLDNULL1010

到目前为止我已经尝试过

这是我想出的方法,它有效:

with tab1 as (
select * from (values('A', 1), ('C', 3))x(key, value)
),
tab2 as (
select * from (values('A', 10), ('D', 10))x(key, value)
),
tab3 as (
select * from (values('B', 20), ('D', 10))x(key, value)
)
select
coalesce(tab1.key, tab2.key, tab3.key) "key",
tab1.value tab1,
tab2.value tab2,
tab3.value tab3
from tab1
full outer join tab2 on tab2.key = tab1.key
full outer join tab3 on tab3.key = coalesce(tab1.key, tab2.key)
order by coalesce(tab1.key, tab2.key, tab3.key)

问题

在上面的情况下,我的查询看起来仍然相当不错,但在实际情况下,我需要连接 6 个表,并且键实际上分布在三列中。这会导致很长的连接语句。第六个表的语句如下所示:

full outer join tab6
on tab6.key1 = coalesce(tab1.key1, tab2.key1, tab3.key1, tab4.key1, tab5.key1)
and tab6.key2 = coalesce(tab1.key2, tab2.key2, tab3.key2, tab4.key2, tab5.key2)
and tab6.key3 = coalesce(tab1.key3, tab2.key3, tab3.key3, tab4.key3, tab5.key3)

复制粘贴爆炸式增长coalesce -从代码质量的角度来看,调用有些令人不安。

是否有另一种更简单的方法来获得我想要的结果?

最佳答案

使用完全连接..使用

SELECT key, t1.value AS tab1, t2.value AS tab2, t3.value AS tab3
FROM t1
FULL JOIN t2 USING (key)
FULL JOIN t3 USING (key)

dbfiddle

关于sql - 如何将具有相同主键的多个表连接到一个每个键一行的表?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/68468362/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com