ORACLE CONNECT BY LEVEL Создание дублирующихся строк - PullRequest
0 голосов
/ 07 ноября 2019

Я пытаюсь извлечь данные из строки, которая состоит из нескольких заметок, которые добавляются в столбец varchar (4000). Я использую смесь регулярных выражений и функций в запросе вместе с CONNECT BY LEVEL с использованием regexp_count, потому что я понятия не имею, будет ли одна заметка или несколько. Когда я возвращал результаты, я заметил, что было много повторяющихся строк. Я полагаю, что это исключительно из-за CONNECT BY, и это не то, что я должен был использовать до сих пор, поэтому я думаю, что я что-то пропустил.

Вот запрос;

    select 
  id,
  substr(regexp_substr(VALUE,'^LOCKED BY USER: +(.*)',1,level,'m'),17) as LOCKUSER,
  substr(regexp_substr(VALUE,'^LOCKED ENTITY: +(.*)',1,level,'m'),16) as LOCKED_ENTITY,
  TO_DATE(LTRIM(regexp_substr(VALUE,'^LOCKED AT: ([[:digit:]]{2}/[[:digit:]]{2}/[[:digit:]]{4}\.?)',1,level,'m'),'LOCKED AT: '),'DD/MM/YYYY') as Dates_Locked,
  substr(regexp_substr(VALUE,'^LOCK NOTES: +(.*)',1,level,'m'),13) as LOCK_NOTES,
  'LOCK' as ACTION
 from TABLE
 where regexp_substr(VALUE,'^LOCK NOTES: +(.*)',1,level,'m') IS NOT NULL
  AND TO_DATE(LTRIM(regexp_substr(VALUE,'LOCKED AT: ([[:digit:]]{2}/[[:digit:]]{2}/[[:digit:]]{4}\.?)',1,level,'m'),'LOCKED AT: '),'DD/MM/YYYY') >= (SYSDATE -365)
connect by level <= regexp_count(VALUE,CHR(10)||CHR(13));

Если я разрешу это запустить для таблицы с 10K-записями, я никогда не получу никаких результатов, которые, как я полагаю, связаны с большим количеством дублирующихся строк, которые он возвращает. Есть ли способ для меня, чтобы предотвратить это?

Большое спасибо

1 Ответ

2 голосов
/ 07 ноября 2019

В настоящее время ваш CONNECT BY ограничивает только уровень иерархии и не предоставляет никаких условий для сопоставления дочерних строк с родительскими строками. Это означает, что в таблице с несколькими строками каждая строка является дочерней по отношению к любой другой строке. Это приведет к массивному результирующему набору.

Если я правильно понимаю, вы пытаетесь использовать иерархическую функциональность для извлечения нескольких значений из каждой отдельной строки. Таким образом, вы действительно хотите, чтобы каждая строка была родительской и дочерней для себя. Я предлагаю попробовать:

CONNECT BY id = PRIOR id
AND prior sys_guid() is not null
AND level <= regexp_count(VALUE,CHR(10)||CHR(13))

Спасибо @kfinity за указание на необходимость использования sys_guid () для предотвращения CONNECT BY LOOP.

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