Sql 如何在Oracle中应用联接以获得结果

Sql 如何在Oracle中应用联接以获得结果,sql,oracle,Sql,Oracle,我有以下三个表格: SHIFT_MASTER,PATTERN_MASTER,PATTERN_DETAILS S_ID、p_ID、p_D_ID分别是SHIFT_MASTER、PATTERN_MASTER和PATTERN_DETAILS表的主键 SHIFT_MASTER S_ID | S_NUMBER| S_Name --------------------------------- 1 A MORNING 2 B A

我有以下三个表格:

SHIFT_MASTER,PATTERN_MASTER,PATTERN_DETAILS
S_ID、p_ID、p_D_ID分别是SHIFT_MASTER、PATTERN_MASTER和PATTERN_DETAILS表的主键

SHIFT_MASTER

S_ID | S_NUMBER|   S_Name
---------------------------------     
1        A          MORNING
2        B          AFTERNOON
3        C          NIGHT

PATTERN_MASTER
P_ID   |  P_NAME
---------------- 
1        Pattern 1  
2        Pattern 2     

PATTERN_DETAILS
P_D_ID|P_ID |  S_ID| ...
---------------------    
1       1        1     
2       1        2     
3       1        3 
4       1        2     
5       1        1     
6       2        3 
7       2        2     
8       2        1     
9       2        3    
我得到的输出是

    P_ID |  S_ID
    1       1,2,3,2,1
    2       3,2,1,3
使用查询

SELECT PATTERN_DETAILS.P_ID "PATTERN",
   LISTAGG(PATTERN_DETAILS.S_ID, ', ')
 WITHIN GROUP (ORDER BY PATTERN_DETAILS.P_D_ID) "SHIFT"
  FROM PATTERN_DETAILS
  GROUP BY PATTERN_DETAILS.P_ID;
我想要的是

P_NAME     | S_NUMBER
Pattern 1    A,B,C,B,A
Pattern 2    C,B,A,C

有什么建议吗???我想显示的不是P_ID而是图案名称,我想显示的不是班次ID而是班次编号。如何与listagg函数一起执行联接操作?

您需要联接所有三个表才能获得此结果

SELECT pm.p_name "P_NAME",
       listagg(sm.s_number, ', ') WITHIN GROUP (ORDER BY pd.p_d_id) "S_NUMBER"
  FROM pattern_master pm,
       pattern_details pd, 
       shift_master sm
 WHERE sm.s_id= pd.s_id 
   AND pm.p_id = pd.p_id
GROUP BY pm.p_name;