Обработка моего запроса на версию без подзапросов - PullRequest
1 голос
/ 29 января 2020

У меня есть запрос, но он работал очень долго, я добавил индексы. Можем ли мы изменить его так, чтобы не было подзапросов, а были только соединения ??? Буду признателен за помощь

SELECT rep.id,
    rep.VALUE_NUMBER,   
     txn.reader_value_string  VALUE_STRING
       FROM IOT_STREAM_ANALYTICS_LOG_REPRESENTATION rep
    LEFT join txn 
   ON  rep.VALUE_NUMBER = txn.transaction_value_number 
   --This part of the code is very late in compiling --
 AND rep.id not in ( select o.id 
  from IOT_STREAM_ANALYTICS_LOG_REPRESENTATION o,
       IOT_STREAM_ANALYTICS_LOG_REPRESENTATION parent
 where o.parent = parent.parent
   and parent.key = 'reader'
   and parent.VALUE_STRING !=  txn.reader_value_string)
 ----------------------------------------------------------------------------------------------
WHERE lower(rep.key) = 'transaction'
      AND rep.value_number <> 0 
group by rep.id,
    rep.value_number, 
    txn.reader_value_string

Это демонстрационная версия https://dbfiddle.uk/?rdbms=oracle_18&fiddle=892dcef2af2f606a7c31d15dfcba7314 без этих подзапросов)

select o.id 
  from IOT_STREAM_ANALYTICS_LOG_REPRESENTATION o,
       IOT_STREAM_ANALYTICS_LOG_REPRESENTATION parent
 where o.parent = parent.parent
   and parent.key = 'reader'
   and parent.VALUE_STRING !=  txn.reader_value_string

1 Ответ

1 голос
/ 29 января 2020

Во-первых, давайте избавимся от not in, поскольку здесь могут быть проблемы с null результатами, и вместо него будем использовать not exists

Давайте также избавимся от устаревших в старом стиле присоединяется:

AND not exists 
  (
  select 1 from
  from IOT_STREAM_ANALYTICS_LOG_REPRESENTATION o
  join IOT_STREAM_ANALYTICS_LOG_REPRESENTATION parent
    on o.parent = parent.parent
  where parent.key = 'reader'
    and parent.VALUE_STRING !=  txn.reader_value_string
  and rep.id = o.id
  )
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...