将 TSQL 查询转换为 Oracle 不起作用

Converting TSQL query to Oracle not working

我在 SQL 服务器中有一个 tsql 查询工作正常。但是当我在 ssis 中的执行 sql 任务中使用它时,针对 Oracle 数据库执行 运行。我收到 'function not allowed in group' 的错误。我知道 Oracle 的分组是不同的,但我不太了解它。

如何将此 tsql 查询转换为 oracle - sql:

SELECT 
    TBL_A.EID AS MYID
    , TBL_A.ID
    , TBL_B.LOGIN AS LOGID  
    , TO_DATE(TBL_B.CM, 'MM/DD/YYYY') as MD 
    , sum(TBL_B.CS) as TTS
    , sum(TBL_B.COTS) as HTS
    , sum(TBL_B.CWS) as WTS
    , sum(TBL_B.CL) as NTS
FROM 
    SRVR1.TBL1 TBL_A JOIN
    SRVR2.TBL2 TBL_B
    ON TBL_A.ID = TBL_B.LOGIN

GROUP BY
    TBL_A.EID
    ,TBL_A.ID
    ,TBL_B.LOGIN
    ,TO_DATE(TBL_B.CM, 'MM/DD/YYYY') as MD  

ORDER BY TBL_B.LOGIN,
    TBL_B.CM    ;

我建议从这样的查询开始:

SELECT TBL_A.EID AS MYID, TBL_A.ID AS LOGID  
       DATEFROMPARTS(year(TBL_B.CM), month(TBL_B.CM), day(TBL_B.CM)) as MD 
       sum(TBL_B.CS) as TTS,
       sum(TBL_B.COTS) as HTS,
       sum(TBL_B.CWS) as WTS,
       sum(TBL_B.CL) as NUM
FROM SRVR1.TBL1 TBL_A JOIN
     SRVR2.TBL2 TBL_B
     ON TBL_A.ID = TBL_B.LOGIN
WHERE rownum < 5
GROUP BY TBL_A.EID, TBL_A.ID, TBL_B.LOGIN,
          DATEFROMPARTS(year(TBL_B.CM),month(TBL_B.CM),day(TBL_B.CM)) 
ORDER BY TBL_B.LOGIN, TBL_B.CM ;

备注:

  • 从不FROM 子句中使用逗号。 始终 使用显式 JOIN 语法。
  • 不要在 GROUP BY 中放置像 SUM() 这样的聚合函数。
  • 为什么SELECT中有idloginJOIN 条件指定它们相同。

另外:

  • datefromparts() 是一个 SQL 服务器专用函数
  • year()month()day() 是 SQL 仅限服务器
  • rownum 仅适用于 Oracle
  • GROUP BY 之前的 rownum 只是 returns 5 个任意行,然后聚合。

我不确定您的查询究竟应该是什么。在 SQL Server 与 Oracle 中看起来会有所不同。