SQL Server 结果与 Oracle 结果不匹配

时间:2021-02-09 17:01:35

标签: sql sql-server

这是我的 Oracle SQL 语句:

select 
    ACCOUNTID as ACCOUNTID,
    CREATEDDATE as CREATEDDATE,
    OLDVALUE as OLDVALUE 
from 
    accounthistory_n_dim 
where 
    rowid in (select A.ROWID 
              from 
                  (select 
                       accountid,
                       row_number() over (partition by accountid order by CREATEDDATE desc) as ROWNUMBER,
                       CREATEDDATE, ROWID 
                   from 
                       accounthistory_n_dim 
                   where 
                       field = 'CSM_Segment__c') A  
              where 
                  A.ROWNUMBER = 1)

我将此 Oracle 代码转换为此 SQL Server T-SQL 语句:

SELECT  
    us.CREATEDDATE AS CREATEDDATE,  
    us.OLDVALUE AS OLDVALUE,  
    us.ACCOUNTID AS ACCOUNTID 
FROM 
    (SELECT
         A.ACCOUNTID,
         A.OLDVALUE,
         ROW_NUMBER() OVER (PARTITION BY A.accountid ORDER BY A.CREATEDDATE DESC) AS ROWNUMBER,
         A.CREATEDDATE
     FROM
         sales_ent.accounthistory_n_dim_bt A 
     WHERE 
         A.field = 'CSM_Segment__c') us
WHERE 
    us.ROWNUMBER = 1

但结果不匹配,因为 SQL Server 中不存在等效的 Oracle rowid。

我的转换是否错误,从 Oracle 到 SQL Server?有什么想法吗?

1 个答案:

答案 0 :(得分:1)

在任一数据库中,我认为这将是更好的方法:

select ah.* 
from (select ah.*,
             row_number() over (partition by accountid order by createddate desc) as seqnum
      from accounthistory_n_dim ah
      where ah.field = 'CSM_Segment__c'
     ) ah
where seqnum = 1;

这将获取具有指定字段的每个帐户的最新行。