繁体   English   中英

通过合并明细字段将主数据表和明细表合并为一行

[英]Combine master and detail table into one row by combining detail fields

我有2张桌子,一张是主人,另一张是细节。 他们有一对多的关系:

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


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

数据外观的示例如下:

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

对于明细表,col1的可能值为:

  • 老鼠

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

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

因此,我将详细信息表折叠为最终结果中的一行。 我不确定如何创建此查询。

我正在尝试类似的方法,但是它不起作用:

SELECT MASTERTABLE.ID, 
CASE WHEN DETAILTABLE.col1 = 'BIRD' THEN 'Y' ELSE NULL END AS BIRD,
CASE WHEN DETAILTABLE.col1 = 'DOG' THEN 'Y' ELSE NULL END AS DOG, 
CASE WHEN DETAILTABLE.col1 = 'CAT' THEN 'Y' ELSE NULL END AS CAT, 
CASE WHEN DETAILTABLE.col1 = 'FISH' THEN 'Y' ELSE NULL END AS FISH, 
CASE WHEN DETAILTABLE.col1 = 'MOUSE' THEN 'Y' ELSE NULL END AS MOUSE
FROM MASTERTABLE LEFT JOIN DETAILTABLE ON MASTERTABLE.ID = DETAILTABLE.mid;

无论是使用PIVOT运算符(从Oracle版本11.1开始)还是使用条件聚合(版本10.2或更早版本)进行数据透视,该PIVOT在任何行集合(无论是单个表还是联接两个表的结果)上均能很好地工作,或SQL中允许的任何其他设置操作的结果(另一种聚合, UNION ALL或其他任何方式)。

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

所以:

在您的查询中,按原样,

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM