将可变数量的行子查询到父查询的字段中的最简单方法是什么?
PeopleTBL
NameID int - unique
Name varchar
Data: 1,joe
2,frank
3,sam
HobbyTBL
HobbyID int - unique
HobbyName varchar
Data: 1,skiing
2,swimming
HobbiesTBL
NameID int
HobbyID int
Data: 1,1
2,1
2,2
该应用为每个NameID定义了0-2个爱好。
通过“选择*来自PeopleTBL”检索到的爱好的最简单方法是什么?
基于以上数据所需的结果:
NameID Name Hobby1 Hobby2
1 joe skiing
2 frank skiing swimming
3 sam
答案 0 :(得分:0)
我不确定我是否理解正确,但如果您想要获取一行中某人的所有爱好,则以下查询可能有用(MySQL):
SELECT NameID, Name, GROUP_CONCAT(HobbyName) AS Hobbies
FROM PeopleTBL
JOIN HobbiesTBL USING NameID
JOIN HobbyTBL USING HobbyID
爱好列将包含由,
分隔的人的所有爱好。
有关详细信息,请参阅GROUP_CONCAT的文档。
我不知道你使用的引擎是什么,所以我提供了一个MySQL示例(我不知道其他sql引擎支持这个)。
答案 1 :(得分:0)
Select P.NameId, P.Name
, Min( Case When H2.HobbyId = 1 Then H.HobbyName End ) As Hobby1
, Min( Case When H2.HobbyId = 2 Then H.HobbyName End ) As Hobby2
From HobbyTbl As H
Join HobbiesTbl As H2
On H2.HobbyId = H.HobbyId
Join PeopleTbl As P
On P.NameId = H2.NameId
Group By P.NameId, P.Name
您所寻求的内容称为交叉表查询。只要列是静态的,您就可以使用上述解决方案。但是,如果要动态构建列,则需要在中间层代码中构建SQL语句或使用报告工具。