【问题标题】:Converting TSQL query to Oracle not working将 TSQL 查询转换为 Oracle 不起作用
【发布时间】:2017-02-23 04:18:17
【问题描述】:

我在 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    ;

【问题讨论】:

  • group by sum(..) 完全没有意义。在 Oracle 和 SQL Server 中都没有。你的DATEFROMPARTS到底在做什么? Oracle 中没有year() 函数。你自己写的吗? rownum < 5 的意图是什么?这就是not going to work 你的想法。请在您的问题中添加确切错误消息。
  • 无论您使用哪种 DBMS,都应该使用 ANSI-92 样式的连接。自推出以来已超过 25 年。 sqlblog.com/blogs/aaron_bertrand/archive/2009/10/08/…
  • 查询不可能像 sql server 中发布的那样工作。您在 group by 中有聚合,并且在 group by 中也有列别名。您是否考虑过转换为日期而不是所有那些将日期时间转换为日期的函数?
  • 同时从 GROUP BY 子句中删除列别名 (as MD)。 group by 子句应该select 子句的剪切粘贴!
  • datefromparts 函数可以简化为这个。转换(日期,getdate())

标签: sql oracle oracle11g database-migration


【解决方案1】:

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

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 语法。
  • 不要将SUM() 之类的聚合函数放在GROUP BY 中。
  • 为什么SELECT 中有idloginJOIN 条件指定它们是相同的。

另外:

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

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

【讨论】:

  • 我至少要提出一个警告,where 将在 group byorder by 之前应用,所以这不会返回“前 5 个聚合行”,它'将取 5 个任意行,对它们进行分组,并对结果进行排序。这似乎不太可能是正确的。
  • 我刚刚添加了 rownum 作为 sql server 中 top n 的替代品。这是我试图转换的半生不熟的查询。 oracle版本的datefromparts怎么办?
  • @DamonMatt 。 . .使用to_date()的东西。
  • 对 oracle 进行了更改并更改了原始帖子 - 仍然出现“sql 命令未正确结束”错误。
  • @Gordon Linoff - 我需要数据集中的前两列。
猜你喜欢
  • 2020-06-15
  • 2018-09-16
  • 1970-01-01
  • 1970-01-01
  • 2019-08-03
  • 1970-01-01
  • 2019-07-29
  • 2018-11-01
  • 2013-07-10
相关资源
最近更新 更多