Oracle 子查询返回多行

Oracle 子查询返回多行,oracle,Oracle,我有两个表,我正试图从中提取信息。这是下表的一个示例,因为它们是大型表。 通过查看表2,我希望表1上的描述是关于列KEY_事件的,唯一的公共列是APP列。 但错误已经到来,子查询不能返回多行 TABLE 1 APP LANGUAGE DESCRIPTION 195 12 Involved person 195 27 Involved person 196 1 Invol

我有两个表,我正试图从中提取信息。这是下表的一个示例,因为它们是大型表。 通过查看表2,我希望表1上的描述是关于列KEY_事件的,唯一的公共列是APP列。 但错误已经到来,子查询不能返回多行

TABLE 1

 APP    LANGUAGE    DESCRIPTION 
195          12         Involved person 
195          27       Involved person   
 196           1         Involvert legemiddel   
196           2    Involved drug    
196           3    Involverad lakemedel 
196          4     Involveret l?gemiddel    
196          12    Involved drug    
196          27    Involved drug    
197          1     Eksponeringsverdier  
197          2     Exposure values  
197          3     Exponeringsvarden    
197          4     Eksponeringsv?rdier  
197         12     Exposure values  
197         27     Exposure values  
198          1     Indikatorer  
198          2     Indicators   
198          3     Indikatorer  
198          4     Indikatorer  
198         12     Indicators   
198         27     Indicators   
199         1      Generell klassifisering  
199         2      General classification   
199         3      Generell klassificering  
199         4      Generel klassifisering   
199        12      General classification   
199         27     General classification   


         TABLE 2
 TRANS    APP
 1         195
 2         195
 3         196
 4         196
 5         196
 6         196
 7         196
 8         196
 9         197
 10        197
11         197
12         197
13         197
14         197
15         198
16         198
17         198
18         198
19         198
20         198
21         199
22         199
23         199
24         199
25         199
26         199
此外,我想使用-如果我们有多个描述的公共appl,我想使用LISTAGG连接描述

     SELECT SELECT  NVL(TO_CHAR(TRANS.ID), 'NULL') AS ID
       , 'HEADER'

       ,NVL(TO_CHAR((SELECT L_APP.DESCRIPTION  
  FROM  L_APP L_APP



      WHERE  EXISTS  ( SELECT 1 FROM TRANS WHERE L_APP.APP =                  TRANS.APP AND LANGUAGE = 2


      )

         )), 'NULL') AS KEY_EVENT

您需要使用聚合来合并行。不能在一个单元格中显示所有行。 因此,LISTAGG是您要查找的关于字符串的内容

以下是一个查询示例:

SELECT  
NVL(TO_CHAR(TRANS.ID), 'NULL') AS ID, 
'HEADER',
NVL(
    TO_CHAR(
            (
                SELECT LISTAGG ( L_APP.DESCRIPTION ,',' ) 
                FROM  L_APP 
                WHERE  EXISTS  ( 
                                SELECT 1 
                                FROM TRANS 
                                WHERE L_APP.APP =                  TRANS.APP AND LANGUAGE = 2
                            )

           )
        ), 'NULL'
) AS KEY_EVENT

据我所知,您需要以英文(
language=2
)作为列
KEY\u EVENT
进行描述,还需要以其他语言列出所有现有描述。请看这个语法。我还附上了一个演示,演示了此查询如何处理您提供的数据

select trans, t2.app, 
       nvl(max(case when language = 2 then description end), 'NULL') key_event,
       listagg(description, ', ') within group (order by t1.language) list
  from table2 t2 
  left join table1 t1 on t1.app = t2.app 
  group by trans, t2.app
  order by trans;
看起来
12
27
也是英文描述,如果您想使用它们(如果
2
不存在),请运行以下命令:

select trans, t2.app,  
       coalesce(max(case when language =  2 then description end), 
                max(case when language = 12 then description end), 
                max(case when language = 27 then description end), 
               'NULL') key_event,
       listagg(description, ', ') within group (order by t1.language) list
  from table2 t2 
  left join table1 t1 on t1.app = t2.app 
  group by trans, t2.app
  order by trans;

我已经能够在本页中使用此答案,itt在连接到一个文件中的过程中没有创建任何副本:

最后的代码是

  select app, key_event,  xmlquery('distinct-values(//text())' passing xmldoc returning content).getclobVal()
from (
select  t2.app,  
       coalesce(max(case when language =  2 then description end), 
                max(case when language = 12 then description end), 
                max(case when language = 27 then description end), 
               'NULL') key_event,
         XMLELEMENT(root,xmlagg(XMLELEMENT(e,description,','))
                  ) xmldoc
  from table2 t2 
  left join table1 t1 on t1.app = t2.app 
  group by trans, t2.app
   order by trans);

A把这个问题读了好几遍,但我还是不明白你到底想要什么。你能添加输入和相应的期望输出吗?我想得到基于公共列的值描述。但是我从第8行得到这个错误“缺少%s关键字”,它来自L_APPThank you Pounder。我用的是第一个。查询的意思是,我在group(order by t1.language)列表中的这一行listagg(description,“,”)中有很多值。如果您的意思是字符串连接的结果太长,那么您不能使用
listagg()
,或者您必须使用中的一个解决方案。Pounder,这不是字符串连接的结果。该行抱怨的是,实际上太多的值是nvl(max(当语言=2时,则说明结束),'NULL')key_事件,对不起,但我不明白。我向你们展示了解决方案,我向你们展示了如何处理你们自己的数据。请阅读。这是工作,但正在创建重复,也不能很容易地适应其他代码我有