Предложение Cognos SQL WITH, генерирующее синтаксическую ошибку

У меня есть SQL-запрос, который я выполняю в Cognos 11 и пытаюсь использовать предложение WITH, но постоянно получаю сообщение об ошибке из-за неправильного синтаксиса рядом с "WITH". Я думал, что мои администраторы org отключили WITH, но я подтвердил, что он включен, и я не могу понять, что не так с моим синтаксисом. Я пробовал это как в родном SQL, так и в сквозном SQL.

У меня есть это завернутый в случае, который в противном случае работает нормально:

CASE 
WHEN SAPStreams.Stream_Type = 'INTELILINK' THEN (
    WITH IntelilinkValues AS (
    SELECT 
        LBD.Amount,
        LBD.Payment_Frequency,
        LBD.No_of_Periods
    FROM _SYS_BIC.LeasingRebooksDetails LBD 
    WHERE LBD.Contract_Number='D003498006')
)
ELSE NULL END

Довольно прямолинейно, и я более убежден, что с реализацией Cognos моей организации что-то не так, чем в том, что SQL неисправен. Надеемся на некоторую помощь от этого сообщества.

4 ответа

У меня нет опыта работы в Cognos DB, но такой запрос не подходит в стандартном стиле SQL, потому что вы пытаетесь вернуть ТРИ ПОЛЯ (Amount, Payment_Frequency, No_of_Periods) в качестве ОДНОГО ПОЛЯ (TestWITH)!!!

Вы не можете поместить общее табличное выражение в запрос. Даже если я поправлю ваш CTE:

CASE 
WHEN SAPStreams.Stream_Type = 'INTELILINK' THEN (
    WITH IntelilinkValues (
        Amount,
        Frequency,
        Periods
    )
    AS (
    SELECT 
        LBD.Amount,
        LBD.Payment_Frequency,
        LBD.No_of_Periods
    FROM _SYS_BIC.LeasingRebooksDetails LBD 
    WHERE LBD.Contract_Number='D003498006'
    )
    select Amount
    from IntelilinkValues
)
ELSE NULL END

... это все равно не сработает.

Но это может сработать:

WITH IntelilinkValues (
    Amount,
    Frequency,
    Periods
)
AS (
SELECT 
    LBD.Amount,
    LBD.Payment_Frequency,
    LBD.No_of_Periods
FROM _SYS_BIC.LeasingRebooksDetails LBD 
WHERE LBD.Contract_Number='D003498006'
)
select Amount
into #ilv
from IntelilinkValues

select ss.somestuff, 
CASE 
WHEN SAPStreams.Stream_Type = 'INTELILINK' THEN (
    select Amount
    from #ilv
)
ELSE NULL END,
sot.someotherstuff

from SAPStreams ss
  inner join someothertable sot on sot.id = ss.id

where somecondition = 'true'

drop table #ilv

Измените синтаксис SQL на сквозной

Просто измените синтаксис SQL с собственного на Direct, и все будет в порядке! Это

Другие вопросы по тегам