Наиболее эффективный способ фильтрации таблицы с отображением от 1 до нескольких родительских и дочерних - PullRequest
0 голосов
/ 06 декабря 2018

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

Вот два (упрощенных) запроса, которые у меня есть, но я чувствую, что есть более эффективный способ выполнить это.особенно при соединении с другими большими таблицами:


-- version 1
select 
    client.id
from
    client
        join client client2 on client.id = client2.masterid 
                               and client2.id = client2.masterid

--version 2

select 
    client.id,
from
    client
where
    client.id = client.masterid

-- Expanded view
select
t1.id masterid,
t1.dob dob,
trunc((months_between(trunc(sysdate),t1.dob)/12),0) age,
case
    when substr(t1.zip,1,5) in ('48502','48503','48504','48505','48506','48507','48529','48532') then null 
else
(select
    max(audit1.operationid)
from
    t2 audit1
where
    t1.id = audit1.sourceid                                                                                             
    and audit1.fieldname = 'ZIP'
    and substr(audit1.oldvalue,1,5) in ('48502','48503','48504','48505','48506','48507','48529','48532')                        
    and audit1.created >= to_date('04/25/2014', 'MM/DD/YYYY')                                                                   
    and 1 < (                                                                                                                   
            select
                count(audr.id)
            from
                t2 audr
            WHERE
                audr.operationid = audit1.operationid
                and audr.fieldname in ('ADDRESS1','CITY')                                                                       
            )                                                                                                                   

) end auditref,
t1.address1 addr1,
t1.address2 addr2,
t1.city city,
substr(t1.zip,1,5) zip
from
t1
where
t1.id = t1.masterid
and 1 = case
            when substr(t1.zip,1,5) in ('48502','48503','48504','48505','48506','48507','48529','48532') then 1
            when substr(t1.zip,1,5) not in ('48502','48503','48504','48505','48506','48507','48529','48532') and exists                                                                                                         
                                    (select
                                        1
                                    from
                                        t2 audit2
                                    where
                                        audit2.sourceid = t1.id                                                                         
                                        and audit2.fieldname = 'ZIP'
                                        and substr(audit2.oldvalue,1,5) in ('48502','48503','48504','48505','48506','48507','48529','48532')    
                                        and audit2.created >= to_date('04/25/2014', 'MM/DD/YYYY')                                               
                                    ) then 1
            else 0
        end 

Любые мысли будут оценены, как и любые другие способы, которыми я пробовал эти объединениявызвал повторяющиеся строки, так как для каждого masterid может быть много идентификаторов.

Редактировать:

Вот более расширенная версия запроса, но при использовании клиента используется больше объединений и фильтров.id = client.masterid заставляет запрос выполняться намного медленнее

Вопрос является наиболее эффективным способом ограничения сканирования таблиц t1 и t2, поскольку эти таблицы огромны ...

1 Ответ

0 голосов
/ 07 декабря 2018

Использование следующего объединения позволило достичь ограничения сканирования таблицы:


from
    client 
        left join client client1 on client1.masterid = client.id and client1.id is null
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...