0

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'
  );

上記のエラーを受け取ります。

4

2 に答える 2

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'
             );
于 2016-03-18T14:57:42.363 に答える
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 設定とは無関係) を使用して、日付値を比較することです。

于 2016-03-18T15:02:25.893 に答える