将 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
中有id
和login
? JOIN
条件指定它们相同。
另外:
datefromparts()
是一个 SQL 服务器专用函数
year()
、month()
和 day()
是 SQL 仅限服务器
rownum
仅适用于 Oracle
- 而
GROUP BY
之前的 rownum
只是 returns 5 个任意行,然后聚合。
我不确定您的查询究竟应该是什么。在 SQL Server 与 Oracle 中看起来会有所不同。
我在 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
中有id
和login
?JOIN
条件指定它们相同。
另外:
datefromparts()
是一个 SQL 服务器专用函数year()
、month()
和day()
是 SQL 仅限服务器rownum
仅适用于 Oracle- 而
GROUP BY
之前的rownum
只是 returns 5 个任意行,然后聚合。
我不确定您的查询究竟应该是什么。在 SQL Server 与 Oracle 中看起来会有所不同。