подзапрос возвращает более одной строки - PullRequest
0 голосов
/ 12 февраля 2019

У меня есть 2 таблицы, которые я пытаюсь извлечь из нее информацию.Это образец таблиц ниже, так как это большие таблицы.Я хочу, чтобы описание НА ТАБЛИЦЕ 1 находилось в столбце KEY_EVENT BY LOOKING в таблице 2, а единственный общий столбец - это столбец 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

Кроме того, я хочу использовать - я хочу объединить ОПИСАНИЕ, ИСПОЛЬЗУЯ СПИСОК, если у нас есть общее приложение с множественным описанием

     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

Ответы [ 3 ]

0 голосов
/ 12 февраля 2019

Насколько я понял, вам нужно описание на английском языке (language = 2) в виде столбца KEY_EVENT, а также список всех существующих описаний на других языках.Пожалуйста, посмотрите на этот синтаксис.Я также приложил демонстрацию, которая показывает, как этот запрос работает с данными, которые вы предоставили.

dbfiddle demo

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;
0 голосов
/ 15 февраля 2019

Мне удалось использовать этот ответ на этой странице, и он не создал ни одного дубликата при объединении в один файл:

ошибка подзапроса и слишком много значений с использованием xmllagg

Финальный код

  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);
0 голосов
/ 12 февраля 2019

Вам нужно использовать агрегацию для объединения строк.Вы не можете показать все строки в одной ячейке.Итак, 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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...