我需要将MSSQL查询转换为Oracle,但最终得到SQL command not properly ended
。
这是MSSQL查询
SELECT * FROM [dbo].[trade] AS [Extent1]
WHERE EXISTS (
SELECT 1 AS [C1] FROM
[dbo].[findetail] AS [Extent2]
INNER JOIN [dbo].[transact] AS [Extent3] ON [Extent2].[transact] = [Extent3].[transact]
WHERE [Extent1].[trade] = [Extent2].[trade]
AND 'ACCR' = [Extent3].[subledger]
AND [Extent3].[date] = '2016-03-18T00:00:00'
)
将其转换为Oracle SQL我以此结束。
SELECT * FROM trade Extent1
WHERE EXISTS
(SELECT 1 C1 FROM findetail Extent2
JOIN transact Extent3
ON Extent2.transact=Extent3.transact
WHERE Extent1.trade=Extent2.trade
AND 'ACCR'=Extent3.subledger
AND Extent3.date='2016-03-18T00:00:00'
);
并收到上述错误。
答案 0 :(得分:0)
Oracle中的日期格式不同。也许是这样的:
SELECT *
FROM trade Extent1
WHERE EXISTS (SELECT 1
FROM findetail Extent2 JOIN
transact Extent3
ON Extent2.transact = Extent3.transact
WHERE Extent1.trade = Extent2.trade AND
Extent3.subledger = 'ACCR' AND
Extent3."date" = DATE '2016-03-18'
);
答案 1 :(得分:0)
DATE
是一个保留字,所以需要用双引号括起来,我假设它是DATE
数据类型所以你可能需要转换字符串:
SELECT *
FROM trade t
WHERE EXISTS (
SELECT 1
FROM findetail f
JOIN transact r
ON f.transact = r.transact
WHERE t.trade = f.trade
AND 'ACCR' = r.subledger
AND r."DATE" = TO_DATE( '2016-03-18T00:00:00', 'YYYY-MM-DD"T"HH24:MI:SS' )
);
如果您只使用r."DATE" = '2016-03-18T00:00:00'
中的字符串,那么Oracle将隐式尝试使用TO_DATE()
函数转换字符串文字,并使用NLS_DATE_FORMAT
会话参数作为格式掩码。如果它们匹配,那么它将工作,但这是一个客户端变量,因此可以更改,然后查询将中断而代码没有更改(并且很难调试)。简单的答案是确保通过使用TO_DATE()
和指定格式掩码(根据上面的查询)比较日期值或使用ANSI日期文字DATE '2016-03-18'
(独立于NLS)设置)。