Внешний Применить преобразование в оракула - PullRequest
0 голосов
/ 17 октября 2018

Преобразование SQL в Oracle для внешнего применения.

У меня есть следующий запрос SQL:

    CREATE VIEW [dbo].[uvw_Templates_RecHist]
    AS
    SELECT RH.company_id
         , CI.company_name
         , RH.rec_date
         , RH.rec_code
         , RH.analyst_id
         , previous_rec_date = LRH.rec_date
         , previous_rec_code = LRH.rec_code
         , previous_analyst_id = LRH.analyst_id
         , [status] = CASE WHEN LRH.rec_date IS NULL THEN 'NEW'
                           WHEN RH.rec_code <> LRH.rec_code THEN 'CHANGE'
                           ELSE '' END
         , load_date = LoadDate
    FROM dbo.tblRecHist RH

    LEFT JOIN dbo.tblCompInd CI 
    ON RH.company_id = CI.company_id

    OUTER APPLY (
             SELECT A.company_id, A.rec_date, A.rec_code, A.analyst_id
             FROM dbo.tblRecHist A
             JOIN (
                   SELECT company_id, rec_date = MAX(rec_date) 
                   FROM dbo.tblRecHist WHERE rec_date < RH.rec_date
                   GROUP BY company_id
                   ) B
             ON A.company_id = B.company_id AND A.rec_date = B.rec_date
             WHERE A.company_id = RH.company_id
     ) LRH

    LEFT JOIN (
       SELECT LoadDate = MAX(LoadDate), AnalystID = MAX(AnalystName), 
              RecDate, CompanyID
       FROM dbo.tblTemplates_LoadLog 
       WHERE Loaded = 1
       GROUP BY RecDate, CompanyID
    )LL
    ON RH.company_id = LL.CompanyID AND RH.rec_date = LL.RecDate

, который я преобразовал в запрос ниже Oracle:

    CREATE VIEW uvw_Templates_RecHist
    AS
    SELECT RH.company_id
         , CI.company_name
         , RH.rec_date
         , RH.rec_code
         , RH.analyst_id
         , LRH.rec_date
         , LRH.rec_code
         , LRH.analyst_id
         , CASE WHEN LRH.rec_date IS NULL THEN 'NEW'
                WHEN RH.rec_code <> LRH.rec_code THEN 'CHANGE'
                ELSE '' END
         , LoadDate as load_date
    FROM tblRecHist RH

    LEFT JOIN tblCompInd CI 
    ON RH.company_id = CI.company_id

    LEFT OUTER JOIN (
          SELECT A.company_id, A.rec_date, A.rec_code, A.analyst_id
          FROM tblRecHist A
          JOIN (
            SELECT company_id, MAX(rec_date) 
            FROM tblRecHist WHERE rec_date < RH.rec_date
            GROUP BY company_id
            ) B
          ON A.company_id = B.company_id AND A.rec_date = B.rec_date
          WHERE A.company_id = RH.company_id
      ) LRH
     ON LRH.company_id=CI.company_id

    LEFT JOIN (
    SELECT MAX(LoadDate), MAX(AnalystName), RecDate, CompanyID
    FROM tblTemplates_LoadLog 
    WHERE Loaded = 1
    GROUP BY RecDate, CompanyID
    )LL
    ON RH.company_id = LL.CompanyID AND RH.rec_date = LL.RecDate

но когда я выполняю запрос оракула, я получаю следующую ошибку:

ORA-00904: "RH". "REC_DATE": неверный идентификатор

1.Почему эта ошибка возникает, даже еслинет ошибки времени компиляции.2. Как решить эту проблему? Есть ли другой способ, которым мы можем преобразовать запрос из SQL в Oracle.

1 Ответ

0 голосов
/ 17 октября 2018

Похоже, ваш подзапрос для LRH просто получает предыдущую строку из tblRecHist.Это может быть место для использования LAG, так как вы ищете 1 строку ранее в той же таблице.

https://oracle -base.com / articles / misc / lag-lead-analytic-functions

Предполагая, что company_id, rec_date уникален, ваш запрос может выглядеть примерно так:Не проверял, поскольку у меня нет вашей базы данных:

SELECT A.*
    ,CASE 
        WHEN previous_rec_date IS NULL
            THEN 'NEW'
        WHEN rec_code <> previous_rec_code
            THEN 'CHANGE'
        ELSE ''
        END
FROM (
    SELECT RH.company_id
        ,CI.company_name
        ,RH.rec_date
        ,RH.rec_code
        ,RH.analyst_id
        ,LAG(RH.rec_date) OVER (
            PARTITION BY RH.company_id ORDER BY rec_date
            ) AS previous_rec_date
        ,LAG(RH.rec_code) OVER (
            PARTITION BY RH.company_id ORDER BY rec_date
            ) AS previous_rec_code
        ,LAG(analyst_id) OVER (
            PARTITION BY RH.company_id ORDER BY rec_date
            ) AS previous_analyst_id
        ,LoadDate AS load_date
    FROM tblRecHist RH
    LEFT JOIN tblCompInd CI ON RH.company_id = CI.company_id
    LEFT JOIN (
        SELECT MAX(LoadDate) LoadDate
            ,MAX(AnalystName) AnalystName
            ,RecDate
            ,CompanyID
        FROM tblTemplates_LoadLog
        WHERE Loaded = 1
        GROUP BY RecDate
            ,CompanyID
        ) LL ON RH.company_id = LL.CompanyID
        AND RH.rec_date = LL.RecDate
    ) A

Вложил запрос, чтобы избежать повторения части «over (partion by...)» В случае, чтобы получить «NEW» и «CHANGE».

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