繁体   English   中英

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

[英]Converting TSQL query to Oracle not working

我在 SQL Server 中有一个运行良好的 tsql 查询。 但是当我在 ssis 中的执行 sql 任务中使用它来针对 Oracle DB 运行时。 我收到“组中不允许的功能”的错误。 我知道 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()这样的聚合函数。
  • 为什么在SELECTidlogin JOIN条件指定它们相同。

此外:

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM