Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/82.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
T-SQL复制,选择';大师;基于修改日期的记录_Sql_Sql Server_Tsql - Fatal编程技术网

T-SQL复制,选择';大师;基于修改日期的记录

T-SQL复制,选择';大师;基于修改日期的记录,sql,sql-server,tsql,Sql,Sql Server,Tsql,我有一个数据库,它有两个ID字段,一个由系统指定为GUID,另一个是ExternalID,用于表示数据清理后的重复项。表中还包含一个ModifiedDate 我正在尝试合并这些记录,最近修改的记录吸收了旧的帐户。我尝试了以下查询类型 SELECT a1.GUID ,a1.ModifiedDate ,a2.GUID ,a2,ModifiedDate FROM Accounts a1 INNER JOIN Accounts a2 on a1.ExternalID = a2.ExternalID

我有一个数据库,它有两个ID字段,一个由系统指定为GUID,另一个是ExternalID,用于表示数据清理后的重复项。表中还包含一个ModifiedDate

我正在尝试合并这些记录,最近修改的记录吸收了旧的帐户。我尝试了以下查询类型

SELECT 
a1.GUID
,a1.ModifiedDate
,a2.GUID
,a2,ModifiedDate
FROM Accounts a1
INNER JOIN Accounts a2 on a1.ExternalID = a2.ExternalID
不幸的是,这会导致重复帐户出现两次,一次用于主记录,另一次用于次级记录,后者将主记录作为副本返回

WITH Dup as (

SELECT 1 as track
,ExternalID DomEx
,ExternalID
,GUID DomGUID
,ModDate

from crm.Accounts
WHERE ExternalID is not null

UNION ALL

SELECT track +1 

,OI.DomEx
,OG.ExternalID
,OG.GUID
,Og.ModDate

from crm.Accounts OG
INNER JOIN Dup OI on OI.ExternalID = OG.ExternalID

)
,
cte_dp as(
SELECT *,
ROW_NUMBER() OVER (PARTITION BY ExternalID Order by track, ModDate desc) rn
FROM Dup
)

SELECT * FROM cte_dp
不幸的是,它达到了100的递归限制,如果该限制被转义,它将无限期地运行

为了呈现所需的结果,是否可以在此处更正逻辑,或者是否有更优雅的解决方案

+--------------+---------------------+--------------------+--+
|  MasterGUID  |  SharedExternalID   |  SubordinateGUID   |  |
+--------------+---------------------+--------------------+--+
| (MasterGUID) | (SharedExternalID)  | (SubordinateGUID)  |  |
| (MasterGUID) | (Shared ExternalID) | (SubordinateGUID)  |  |
+--------------+---------------------+--------------------+--+
是我理想情况下想要实现的结果,MasterGUID是两个副本之间最新修改日期的GUID

MERGE Accounts a1
USING Accounts a2
ON a1.ExternalID = a2.ExternalID
WHEN MATCHED THEN
  UPDATE
  SET a1.ModifiedDate = a2.ModifiedDate,
  a1.guid = a2.guid;

SELECT * FROM Accounts a1;
是对称的,因此如果切换顺序,关系将具有相同的逻辑结果。因此,如果您找到这样一对(例如,self),那么它将在结果中出现两次。我们需要用一个附加条件来打破对称性:

a1.ExternalID = a2.ExternalID and a1.GUID < a2.GUID
a1.ExternalID=a2.ExternalID和a1.GUID

这将阻止与self连接。如果需要,您可以使用
union
,但现在我假设不需要。如果有另一个
ExternalID
匹配,则如果左侧的
GUID
比右侧小,则匹配将产生true,因此相反的结果将不为true,重复项将消失。

如果发布示例数据,这将更容易,但这是您的意思吗

SELECT *
FROM (
    select *
    , ROW_NUMBER() OVER (PARTITION BY ExternalID ORDER BY ModifiedDate DESC) rnk
    from accounts 
) i
WHERE i.rnk = 1

你能发布样本和预期数据吗?以上编辑,谢谢
SELECT *
FROM (
    select *
    , ROW_NUMBER() OVER (PARTITION BY ExternalID ORDER BY ModifiedDate DESC) rnk
    from accounts 
) i
WHERE i.rnk = 1