将可变数量的行子查询到父查询的字段中的最简单方法是什么?

时间:2010-06-24 22:52:34

标签: sql

将可变数量的行子查询到父查询的字段中的最简单方法是什么?

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

2 个答案:

答案 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语句或使用报告工具。