SQL 语句从右表的多行中获取单个值作为输出中的列

Posted

技术标签:

【中文标题】SQL 语句从右表的多行中获取单个值作为输出中的列【英文标题】:SQL statement to get individual values from multiple rows from right table as columns in output 【发布时间】:2021-03-06 15:40:41 【问题描述】:

我有两张桌子:

表 A:

ID  
1
2
3
4
5

表 B:

ID  UDFNumber UDFValue
1   5         ID1sUDF5Value
1   6         ID1sUDF6Value
1   7         ID1sUDF7Value
1   8         ID1sUDF8Value
1   9         ID1sUDF9Value
2   5         ID2sUDF5Value
2   6         ID2sUDF6Value
2   7         ID2sUDF7Value
2   8         ID2sUDF8Value
2   9         ID2sUDF9Value
etc

我正在尝试仅将 UDF5 和 UDF9 的值作为表 A 中每一行的列输出。

我正在寻找的输出:

ID  UDF5            UDF9
1   ID1sUDF5Value   ID1sUDF9Value
2   ID2sUDF5Value   ID2sUDF9Value
3   ID3sUDF5Value   ID3sUDF9Value

等等

什么 join/sql 语句会产生这个结果? MS SQL 服务器。

【问题讨论】:

你试过什么?你在哪里卡住了?向我们展示你的尝试。 【参考方案1】:

您可以使用条件聚合:

select id, 
    max(case when udfnumber = 5 then udfvalue end) as udf5,
    max(case when udfnumber = 9 then udfvalue end) as udf9
from tableb
where udfnumber in (5, 9)
group by id

请注意,您不需要 tablea 来生成您想要的结果 - 除非您希望在 tableb 中允许没有匹配的行。如果是这样:

select a.id, 
    max(case when b.udfnumber = 5 then b.udfvalue end) as udf5,
    max(case when b.udfnumber = 9 then b.udfvalue end) as udf9
from tablea a
left join tableb b on b.id = a.id and b.udfnumber in (5, 9)
group by a.id

最后:对于两个值,加入两次是一个可行的选择:

select a.id, b5.udfvalue as udf5, b9.udfvalue as udf9
from tablea a
left join tableb b5 on b5.id = a.id and b5.udfnumber = 5
left join tableb b9 on b9.id = a.id and b8.udfnumber = 9

【讨论】:

这正是我想要的。我将使用连接的附加示例,因为这是需要连接的更大解决方案的一部分。我只是不知道如何将表 B 中的两行作为可连接行获取到表 A,并将值作为列。谢谢。

以上是关于SQL 语句从右表的多行中获取单个值作为输出中的列的主要内容,如果未能解决你的问题,请参考以下文章

在单个查询中获取多个 SQL 表的列

SQL Join 与单个表的多行

如何在 QT C++ 中从表的列中获取 SQL 中的所有值

我如何从Laravel中具有多行的列中扣除单个值

从左表返回所有行,从右表返回不同的匹配行

SQL语句中LEFT JOIN和RIGHT JOIN 以及INNER JOIN的区别