Как получить значения выбора, не удаляя дубликаты, используемые во внутреннем запросе, используя оракул? - PullRequest
0 голосов
/ 17 июня 2019

Мне нужен набор результатов с дубликатами, созданными во внутреннем запросе, так как сейчас я получаю выбранные значения как один результат для дубликатов во внутреннем запросе.

Текущий рабочий запрос

select listagg(column3, '') within group (order by column3) 
from table_name
where column3 in ('ABA', 'ABC', 'ABC', 'ABD', 'ABF', 'ERF', 'AGR', 'LFS', 'BOE') and
      column1=384

получение результата как

ABAABCABFERFLFSBOE

на основе условия column3 и column1, доступного в таблице, я распечатаю все значения строки column3 в одной строке без добавления пробела или дополнительных символов

Но мне нужен реальный результат как

ABAABCABCABFERFLFSBOE

Мне нужно получить результат дважды в виде дубликатов внутри запроса in. Может ли кто-нибудь помочь мне в этом запросе, не удаляя дубликаты, печатая, поскольку условие истинно и дублирует внутренний запрос.

Ответы [ 2 ]

0 голосов
/ 17 июня 2019

Для этой цели вам нужно left join вместо in:

select listagg(t.column3, '') within group (order by t.column3) 
from (select 'ABA' as val from dual union all
      select 'ABC' as val from dual union all
      select 'ABC' as val from dual union all
      select 'ABD' as val from dual union all
      select 'ABF' as val from dual union all
      select 'ERF' as val from dual union all
      select 'AGR' as val from dual union all
      select 'LFS' as val from dual union all
      select 'BOE' as val from dual
     ) v left join
     table_name t
     on v.val = t.column3
where v.column1 = 384;
0 голосов
/ 17 июня 2019

Насколько я могу судить, запрос, который вы написали , будет работать так, как вы этого хотите.

Похоже, что одна из строк, чья column3 = 'ABC' не имеет column1 = 384, что привело к удалению одного из ABC появлений из результата.

Как не удалить эти дубликаты? Возможно, используя соединение?

SQL> with tn (col1, col3) as
  2    (select 384, 'ABC' from dual union all
  3     select 111, 'ABC' from dual union all
  4     select 384, 'FFF' from dual union all
  5     select 384, 'DDD' from dual
  6    )
  7  select listagg(a.col1, '') within group (order by null) result
  8  from tn a join tn b on a.col3 = b.col3
  9  where a.col3 in ('ABC', 'ABC', 'FFF')     --> simulating your IN list
 10    and b.col1 = 384;

RESULT
-----------------------------------------------------------------------------
111384384

SQL>
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...