Настройка ниже запроса - PullRequest
       1

Настройка ниже запроса

0 голосов
/ 28 сентября 2018

Можно ли настроить приведенный ниже запрос?Могу ли я написать это без использования оператора минус

( SELECT table_owner || '.' || table_name AS table_name
  FROM all_tab_modifications
  WHERE timestamp >= SYSDATE - 80 AND table_owner IN (
       'AXIOM_DATA',
       'AXIOM_DATA2',
       'AXIOM_META',
       'AXIOM_META2'
  ) AND table_name LIKE 'RPTD_%'
)
MINUS
( SELECT owner || '.' || object_name AS table_name
  FROM dba_objects
  WHERE created >= SYSDATE - 80 AND owner IN (
       'AXIOM_DATA',
       'AXIOM_DATA2',
       'AXIOM_META',
       'AXIOM_META2'
  ) AND object_name LIKE 'RPTD_%' AND object_type = 'TABLE'
);

Ответы [ 3 ]

0 голосов
/ 28 сентября 2018

Вы можете попробовать преобразовать его в запрос NOT EXISTS.Если вам не нужен created >= SYSDATE - 80, вы можете запросить меньшую таблицу dba_tables вместо dba_objects, что означает, что ваш запрос может быть записан как

SELECT table_owner || '.' || table_name AS table_name
    FROM all_tab_modifications m
     WHERE timestamp >= SYSDATE - 80 AND table_owner IN (
          'AXIOM_DATA',
          'AXIOM_DATA2',
          'AXIOM_META',
          'AXIOM_META2'
     ) AND table_name LIKE 'RPTD_%' AND NOT EXISTS (
          SELECT 1
          FROM dba_tables t
          WHERE t.owner = m.table_owner AND t.table_name = m.table_name
     );

Однако, если вы все еще хотите это сравнение,условия должны быть использованы соответствующим образом в NOT EXISTS с dba_objects

SELECT table_owner || '.' || table_name AS table_name
     FROM all_tab_modifications m
     WHERE timestamp >= SYSDATE - 80 AND table_owner IN (
          'AXIOM_DATA',
          'AXIOM_DATA2',
          'AXIOM_META',
          'AXIOM_META2'
     ) AND table_name LIKE 'RPTD_%' AND NOT EXISTS (
          SELECT 1
            FROM dba_objects t
          WHERE t.owner = m.table_owner AND t.object_name = m.table_name 
          AND t.object_type ='TABLE'
          AND t.created  >= SYSDATE - 80 
     );
0 голосов
/ 28 сентября 2018

У меня нет базы данных Oracle для проверки индексов или плана объяснения, но ...

 SELECT owner || '.' || object_name AS table_name
 FROM dba_objects
 WHERE created >= SYSDATE - 80 AND owner IN (
   'AXIOM_DATA',
   'AXIOM_DATA2',
   'AXIOM_META',
   'AXIOM_META2'
 ) AND object_name LIKE 'RPTD_%' 
 AND object_type != 'TABLE'
0 голосов
/ 28 сентября 2018

Вы можете использовать LEFT JOIN вместо MINUS:

SELECT m.table_owner ||'.' ||m.table_name AS table_name 
FROM ALL_TAB_MODIFICATIONS m
LEFT OUTER JOIN dba_objects o 
    ON m.table_owner = o.owner 
    AND m.table_name = o.object_name 
    AND o.created >= sysdate -80 
    AND o.object_type = 'TABLE'
WHERE TIMESTAMP >= sysdate -80 
    AND m.table_owner IN ('AXIOM_DATA','AXIOM_DATA2','AXIOM_META','AXIOM_META2') 
    AND m.table_name LIKE 'RPTD_%'
    AND o.table_name IS NULL

правая часть объединения должна быть нулевой

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