Могу ли я использовать данные CTE внутри другого CTE, соединив их обоих (Oracle SQL) - PullRequest
0 голосов
/ 16 апреля 2020

Требование Я хочу получить первые четыреста GROUP_ID из таблицы (больше, чем входной GROUP_ID), и в той же таблице для каждого GROUP_ID есть два LOG_ID, из которых я хочу самый низкий , Как только я получу самый низкий LOG_ID, я буду использовать этот LOG_ID для получения данных из другой таблицы, где это внешний ключ.

ИСПОЛЬЗОВАННЫЙ ПОДХОД Сначала я сформировал подмножество лучших 400 GROUP_ID, которые больше, чем входные GROUP_ID. Затем я использовал все GROUP_ID во втором подмножестве, где я получу самый низкий LOG_ID для каждого GROUP_ID. И, наконец, когда у меня самый низкий LOG_ID, я использовал его для получения подробностей из другой таблицы.

QUERY USED

WITH INIT AS (
SELECT GROUP_ID
    FROM PV_ADAPTER_LOG
    WHERE GROUP_ID > 2004141441192825
    AND ADAPTER_ID IN ('2568','2602')
    ORDER BY GROUP_ID
    FETCH FIRST 400 ROWS ONLY
)
,INIT2 AS (
SELECT MIN(L.LOG_ID) AS LOG_ID
    FROM PV_ADAPTER_LOG L
    JOIN INIT ON INIT.GROUP_ID =L.GROUP_ID
    GROUP BY L.GROUP_ID
)
SELECT  A.LOG_ID,A.OPER_SEQ AS CALL_SEQUENCE,A.GROUP_ID ,B.INTERFACE_ID,A.INSTRUCTION_NAME, B.ADAPTER_DETAIL AS XML_CONTENT,B.SEQ AS XML_SEQUENCE
    FROM INIT2
    JOIN PV_ADAPTER_LOG A ON A.LOG_ID=INIT2.LOG_ID
    JOIN PV_ADAPTER_LOG_DETAIL B ON B.LOG_ID=A.LOG_ID

Правильный ли мой подход или Есть ли другой способ добиться этого.

Ответы [ 2 ]

1 голос
/ 16 апреля 2020

Вы можете использовать analytical function, чтобы получить первые 400 групп, а затем записать с минимальным значением log_id для каждой группы в одном запросе следующим образом:

SELECT GROUP_ID, LOG_ID FROM
(SELECT P.GROUP_ID, P.LOG_ID,
       ROW_NUMBER() OVER (ORDER BY GROUP_ID) AS RNGRP, 
       ROW_NUMBER() OVER (PARTITION BY GROUP_ID ORDER BY LOG_ID) AS RNLOG
  FROM PV_ADAPTER_LOG
 WHERE GROUP_ID > 2004141441192825
   AND ADAPTER_ID IN ('2568','2602'))
WHERE RNGRP <= 400 AND RNLOG = 1;

Затем вы можете использовать его где угодно использовать это. (В CTE или во внутреннем виде)

1 голос
/ 16 апреля 2020

I думаю это то, что вы ищете:

  • Используйте row_number по группам, чтобы найти первые 400 строк
  • Использовать row_number разбит на группы и упорядочен по журналу, чтобы найти первый журнал для группы

Что:

WITH INIT AS (
  SELECT P.*,
    ROW_NUMBER () OVER ( 
      ORDER BY GROUP_ID 
    ) RN,
    ROW_NUMBER () OVER ( 
      PARTITION BY GROUP_ID 
      ORDER BY LOG_ID
    ) MN
  FROM PV_ADAPTER_LOG p
  WHERE GROUP_ID > 2004141441192825
  AND ADAPTER_ID IN ('2568','2602')
)
 SELECT * FROM INIT
 WHERE  RN <= 400
 AND    MN = 1
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...