Преобразование подзапроса в CTE

#sql #oracle #common-table-expression

#sql #Oracle #common-table-expression

Вопрос:

Пожалуйста, как я могу переписать этот запрос с помощью cte

 select distinct(ref_device_id)
from heart_beat
where ref_device_id in (select DEVICE_ID
                        from enrollment_ref er
                        join node n on n.enrollment_ref = er.id)
 

Комментарии:

1. Что вы пробовали? Это не особенно сложно.

2. DISTINCT не является функцией. Кроме того, что не так с существующим запросом? Как вы ожидаете, что предложение факторизации подзапроса (также известное как CTE) улучшит запрос по сравнению с использованием или? IN EXISTS

3. Я изучаю, как использовать CTE, поэтому я хотел попробовать использовать его в этом запросе, как пример. но я думаю, что знаю, что этот вариант оптимален для того, чего я пытался достичь с помощью этого запроса.

Ответ №1:

Вы могли бы использовать:

 WITH cte ( device_id ) AS (
  SELECT device_id
  FROM   enrollment_ref er
         INNER JOIN node n
         ON ( n.enrollment_ref = er.id )
)
SELECT DISTINCT
       ref_device_id
FROM   heart_beat
WHERE  ref_device_id in ( SELECT device_id FROM cte );
 

или

 WITH cte ( ref_device_id ) AS (
  SELECT DISTINCT
         ref_device_id
  FROM   heart_beat
  WHERE  ref_device_id in (
           SELECT device_id
           FROM   enrollment_ref er
                  INNER JOIN node n
                  ON ( n.enrollment_ref = er.id )
         )
)
SELECT ref_device_id
FROM   cte;
 

Комментарии:

1. о, я думал, что не смогу указать соединение в CTE .. Я увидел это, когда попытался выполнить поиск в Интернете… очевидно, что я очень большой новичок… спасибо .. это сработало