有一个稍微棘手的问题,我想要一些建议。我有一个源SQL表,我需要分成两个单独的表。源包含一堆列,包括邮政地址。
我需要做的是将包含任何地址的第一个实例的行添加到第一个表中,然后将相同地址的任何后续出现(如果有的话)添加到第二个表中,另外一个列包含第一个表中行的ID(用于连接目的)。
有人可以建议怎么做吗?我更喜欢将它全部保存在T-SQL(MS SQL Server 2008)中,但如有必要,我可以将一些C#作为整个过程的一部分。
答案 0 :(得分:1)
您应该能够创建合适的CTE(公用表表达式),将这些地址分开。你没有提供太多细节 - 所以我试着编写一些列和表名 - 根据需要调整它们。
试试这个 - 它会删除你桌子上的所有重复项:
;WITH DuplicateAddr AS
(
SELECT
(list of columns you need),
ROW_NUMBER() OVER (PARTITION BY Street,ZipCode,City
ORDER BY DateLastChange DESC) 'RowNum'
FROM dbo.Addresses
)
SELECT (list of columns)
FROM DuplicateAddr
WHERE RowNum > 1
GO
使用此CTE,您可以根据列列表“分区”数据 - 使用您需要使用的列。每个数据分区(例如,由Street,ZipCode,City
定义的每个地址)将根据某些排序(您在CTE中定义 - 我选择DateLastChange
作为一种可能性)获得序列号。
因此,RowNum = 1
的行构成了“第一个”地址的集合 - 而不仅仅是SELECT (columns) FROM DuplicateAddr
,您当然也可以根据该条件执行INSERT INTO ....
。< / p>
所有带有RowNum > 1
的行都是“重复”或其他地址 - 将这些地址插入第二个表格。