在由代码分区的每个表上使用ROW_NUMBER窗口函数,可以对每个具有共同代码的行进行编号,然后组合每个查询的结果以匹配基于代码的行以及该代码的编号实例。因此,在表1将第一代码A表2匹配的第一个代码A,等
示例代码显示这(SQL 2005或更高版本):
-- Sample code prep
CREATE TABLE #Table1
(
IdNumberGeneratedFromAService INT NOT NULL,
CodeName NVARCHAR(MAX)
);
CREATE TABLE #Table2
(
Table2Id INT NOT NULL IDENTITY(1,1),
Name NVARCHAR(MAX),
IdNumberThatComesFromTabl1 INT NULL,
CodeNameForTable1ToMatch NVARCHAR(MAX)
);
INSERT INTO #Table1(IdNumberGeneratedFromAService, CodeName)
VALUES(100,'Code A'),(150,'Code A'),(200,'Code B'),(250,'Code A'),(300,'Code C'),(400,'Nonexistent');
INSERT INTO #Table2(Name, IdNumberThatComesFromTabl1, CodeNameForTable1ToMatch)
VALUES('A1-100',0,'Code A'),('A2-150',0,'Code A'),('A3-250',0,'Code A'),('B1-200',0,'Code B'),('C1-300',0,'Code C'),('No Id For Me',0,'Code No Id :(');
-- Sample select statement that shows the row numbers
--SELECT *
--FROM
-- (SELECT *, ROW_NUMBER() OVER (Partition By IT2.CodeNameForTable1ToMatch Order By IT2.Table2Id) as RowNum
-- FROM #Table2 IT2) T2
-- INNER JOIN
-- (SELECT *, ROW_NUMBER() OVER (Partition By IT1.CodeName Order By IT1.IdNumberGeneratedFromAService) as RowNum
-- FROM #Table1 IT1) T1
-- ON T1.CodeName = T2.CodeNameForTable1ToMatch AND T1.RowNum = T2.RowNum;
-- Table 2 Before
SELECT * FROM #Table2;
-- Actual update statement
UPDATE #Table2
SET IdNumberThatComesFromTabl1 = T1.IdNumberGeneratedFromAService
FROM #Table2 AT2
INNER JOIN
(SELECT *, ROW_NUMBER() OVER (Partition By IT2.CodeNameForTable1ToMatch Order By IT2.IdNumberThatComesFromTabl1) as RowNum
FROM #Table2 IT2) T2
ON T2.Table2Id = AT2.Table2Id
INNER JOIN
(SELECT *, ROW_NUMBER() OVER (Partition By IT1.CodeName Order By IT1.IdNumberGeneratedFromAService) as RowNum
FROM #Table1 IT1) T1
ON T1.CodeName = T2.CodeNameForTable1ToMatch AND T1.RowNum = T2.RowNum;
-- Table 2 after
SELECT * FROM #Table2;
-- Cleanup
DROP TABLE #Table1;
DROP TABLE #Table2;
我把你的两个示例表到临时表格,并添加了'代码A'的3条记录,'代码B'的记录以及'代码C'的记录。表1中的代码根据表1 ID的顺序进行编号,表2中的代码通过自动递增的表2 ID进行排序。我还在每张表格中加入了一张不会与另一张相匹配的记录。我试图让代码的描述性更容易看到发生了正确的匹配(他们为了表2的顺序很重要,因为它有一个自动递增的ID)
注释掉的示例选择有助于理解在我将它加入到UPDATE语句之前,选择是如何工作的。
所以我们可以在更新之前看到表2全部为0,然后我们更新表2中的值,其中唯一表2的id与我们编号匹配的匹配连接中的唯一表2的id匹配,然后我们从表中选择2再次查看结果。
你能为此提供一些样本数据吗? –
你能为我们覆盖所有的角落案例吗?如果Table有3个代码的ID,但该代码在Table2中只出现两次?对于特定的代码,Table2有可能比Table1有更多的行吗? – MatBailie
您是否可以修改您的示例数据,以便Table2有额外的行并告诉我们该案例的预期结果? –