通过组合详细信息字段将主表和详细信息表组合成一行

时间:2017-10-13 22:12:40

标签: sql oracle

我有2个表,其中一个是主要的,另一个是详细信息。他们有一对多的关系:

let namespace = Bundle.main.infoDictionary!["CFBundleExecutable"] as! String

数据的外观如下:

MasterTable
------------
id (pk)
col1


DetailTable
------------
id (pk)
mid (fk to MasterTable id)
col1

对于详细信息表,col1的可能值为:

  • BIRD
  • DOG
  • CAT
  • FISH
  • MOUSE

然后我需要创建一个查询,该查询将为主表中的每个id进行布局,以查看它们是否具有这些值中的任何一个。所以最终的查询结果如下所示:

MasterTable

ID   
---
1     
2
3
4
5 


DetailTable

ID | MID   | COL1  |
---|-------|-------|
1     1       BIRD     
2     1       DOG                      
3     1       DOG --Duplicates are allowed for the same MID
4     1       CAT
5     2       CAT
6     5       FISH

所以我在最终结果中将详细信息表折叠成一行。我不确定如何创建此查询。

我正在尝试这样的事情,但它不起作用:

MasterID | BIRD | DOG | CAT | FISH | MOUSE
-----------------------------------------------------
1           Y     Y      Y
2                        Y
3
4                        
5                              Y

1 个答案:

答案 0 :(得分:3)

透视,无论是使用PIVOT运算符(从Oracle版本11.1开始)还是使用条件聚合(版本10.2或更早版本),都可以在任何行集上运行,无论是单个表,连接两个表的结果,或SQL中允许的任何其他设置操作的结果(另一个聚合,UNION ALL或其他任何内容)。

你的尝试非常接近。您所要做的就是GROUP BY MASTERTABLE.ID(因为您只需要每MASTERTABLE.ID行一行)并获取所有MAX表达式的CASE:如果至少有一个'Y'它们是MAX'Y'NULL,否则是CASE .... END as BIRD

所以:

在您的查询中,完全按照原样,

  • MAX(CASE ... END) as BIRD更改为GROUP BY MASTERTABLE.ID
  • 在末尾添加launchy