使用 switch case 连接两个表以避免一对多连接

Posted

技术标签:

【中文标题】使用 switch case 连接两个表以避免一对多连接【英文标题】:Join two tables with switch case in order to avoid one to many join 【发布时间】:2021-08-04 04:29:02 【问题描述】:

我有两张桌子,t1t2

表 t1:

Name address id
---- ------- --
rob  32 cgr  12
mary 31 lmo  42
tom  axel St 2

表 t2:

ID Flag expense
-- ---- --------
12 Shop 1200
12 Educ 14000
42 educ 4000

现在我必须创建一个表,其中包含 t1 中的属性以及另外两个属性,即 shop 中的费用和 edu 中的费用

表 t3

Name address id Shop_ex Educ_ex
---- ------- -- ------- -------
rob  32 cgr  12 1200    14000
mary 31 lmo  42 NULL    4000
tom  axel st 2  NULL    NULL

如何做到这一点?

我尝试使用 switch case 进行左连接 t2,但它给了我多个记录,因为连接变成了一对多。

select 
    t1.name, t1.address, t1.id,
    case 
        when t2.flag = "shop" then t2.expense
        else null 
    end as shop_ex
    case 
        when t2.flag = "educ" then t2.expense
        else null 
    end as educ_ex
from 
    t1 
left join 
    t2 on (t1.id = t2.id)

看来我必须在加入之前先转换 t2 表,以便在标志的基础上拥有一条记录。但我不知道该怎么做。

请注意表格很大,优化的查询会很好。

请提出建议。

【问题讨论】:

【参考方案1】:

您只需要将第一个表连接到第二个表,两次:

SELECT t1.Name, t1.address, t1.id, t2a.expense AS Shop_ex, t2b.expense AS Educ_ex
FROM table1 t1
LEFT JOIN table2 t2a
    ON t2a.ID = t1.id AND t2a.Flag = 'Shop'
LEFT JOIN table2 t2b
    ON t2b.ID = t1.id AND t2b.Flag = 'Educ'

Demo

【讨论】:

以上是关于使用 switch case 连接两个表以避免一对多连接的主要内容,如果未能解决你的问题,请参考以下文章

我可以使用带有两个变量的case / switch语句吗?

GCC 4.4:避免在 gcc 中对 switch/case 语句进行范围检查?

避免 switch case -linq [重复]

我可以使用带有两个变量的 case/switch 语句吗?

C语言 回滚技术 switch case

对一个 switch case 语句使用两个值