Как написать сценарий SQL, чтобы найти все отношения, связанные с исходным идентификатором? - PullRequest
1 голос
/ 25 февраля 2020

Например:

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

SELECT TAX_ID, ACCOUNT_NUMBER FROM CUSTOMER_RECORDS

У меня будет список всех учетных записей. Однако с каждой учетной записью также могут быть связаны другие налоговые идентификаторы (созаемщик, поручители и т. Д. c). Поэтому я хочу взять возвращенные счета и затем найти все налоговые идентификаторы, связанные с ними. Затем мне нужно повторить эти шаги, чтобы найти все учетные записи, связанные со всеми новыми налоговыми идентификаторами, которые были возвращены.

Конечным результатом будет список учетных записей и налоговых идентификаторов, которые все образуют одну "связь".

Я думал, что рекурсивный CTE может работать для этого сценария? Тем не менее, это немного выше моего уровня навыка в SQL. Я был бы очень признателен за любую помощь.

Ответы [ 2 ]

0 голосов
/ 25 февраля 2020

Уверен, что вы можете сделать это с помощью иерархического запроса . Будьте осторожны - эти вещи могут уйти от вас, если вы не будете осторожны, а затем вам позвонит администратор базы данных «почему запрос выполняется в течение 6 дней». Пример:

with base_data as
(
  select 1 as tax_id, 'A' as account_number from dual union all
  select 1 as tax_id, 'B' as account_number from dual union all
  select 2 as tax_id, 'A' as account_number from dual union all
  select 2 as tax_id, 'B' as account_number from dual union all
  select 2 as tax_id, 'C' as account_number from dual union all
  select 3 as tax_id, 'D' as account_number from dual union all
  select 3 as tax_id, 'E' as account_number from dual union all
  select 4 as tax_id, 'E' as account_number from dual union all
  select 4 as tax_id, 'F' as account_number from dual union all
  select 5 as tax_id, 'A' as account_number from dual union all
  select 5 as tax_id, 'F' as account_number from dual union all
  select 6 as tax_id, 'G' as account_number from dual union all
  select 7 as tax_id, 'H' as account_number from dual union all
  select 7 as tax_id, 'I' as account_number from dual union all
  select 8 as tax_id, 'I' as account_number from dual union all
  select 8 as tax_id, 'K' as account_number from dual
)

select distinct bd.*
from base_data bd
start with tax_id = :taxID
connect by nocycle (prior account_number = account_number or prior tax_id = tax_id)
--and level <= 10
order by 1, 2

Как написано, с "и уровнем <= 10" закомментировано, это вернет все элементы. Может захотеть раскомментировать его и установить максимальный уровень - по сути, он устанавливает ограничение на то, как далеко вниз от "дыры" будет выглядеть запрос. </p>

0 голосов
/ 25 февраля 2020

Пожалуйста, попробуйте следующее:

with customer_records as
(
select 111 tax_id, 0 account_number from dual union
select 1 , 100 from dual union
select 1 , 200 from dual union
select 1 , 300 from dual union
select 1 , 400 from dual union
select 2 , 100 from dual union
select 3 , 202 from dual union
select 4 , 303 from dual union
select 5 , 400 from dual union
select 0 , 222 from dual 
)
SELECT c1.TAX_ID, c1.ACCOUNT_NUMBER 
FROM CUSTOMER_RECORDS c1
where 1=1
  and c1.tax_id = :tax_id
union
SELECT c2.TAX_ID, c2.ACCOUNT_NUMBER 
FROM CUSTOMER_RECORDS c1
, CUSTOMER_RECORDS c2
where 1=1
  and c1.tax_id = :tax_id
  and c1.tax_id <> c2.tax_id 
  and c1.account_number = c2.account_number
;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...