Предложение 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 с собственного на Direct, и все будет в порядке! Это