首页 > 解决方案 > SQL Server 表连接 - 是否可以遍历潜在匹配并忽略以前匹配的记录

问题描述

我有一个迁移的订单数据集,其中一些原始产品在迁移时被合并到同一个“新产品”中。在下面的示例中,产品 1 和 3 合并为“新产品 1”。

当订单被迁移过来时,它们不是将产品 1 和 3 组合在一个订单上,而是作为具有相同产品名称的单独行项目加载的。我需要加入这两个表并获得订单行项目的 1-1 关系。

我的问题是,当我加入(Table2.Legacy_Order_number = Table1.Order_number 和 Table2.Amount = Table1.Amount)时,我的结果包括重复,因为有 2 个可能的匹配项。

我的问题是:由于表 2 中的两个“新产品 1”行项目中的哪一个与表 1 中的 Product1 和 Product3 匹配并不重要,有没有办法遍历潜在的匹配项,然后忽略已经匹配的记录?

当前查询:

SELECT
     T1.ID AS Original_Order_Number
    ,T1.Name AS Original_Product
    ,T2.ID AS New_ID
    ,T2.Name AS New_Product
    ,T2.Amount
FROM Table1 T1 
LEFT JOIN Table2 T2
    ON T2.Legacy_Order_number = T1.Order_number 
        AND T2.Amount = T1.Amount 

表格1:

订单号 姓名 数量
1 产品1 50.00
1 产品2 100.00
1 产品3 50.00

表 2:

ID 旧订单号 姓名 数量
19 1 新产品1 50.00
20 1 新产品2 100.00
21 1 新产品1 50.00

期望的查询结果:

原始订单号 原创产品 新身份证 新产品 数量
1 产品1 19 新产品1 50.00
1 产品3 21 新产品1 50.00
1 产品2 20 新产品2 100.00

标签: sqlsql-server

解决方案


您可以为每个表添加分区行号,然后将行号添加为连接条件

这意味着每行仅与匹配行连接一次,同时仍保持Order_numberAmount作为主要连接条件。

SELECT
     T1.ID AS Original_Order_Number
    ,T1.Name AS Original_Product
    ,T2.ID AS New_ID
    ,T2.Name AS New_Product
    ,T2.Amount
FROM (
    SELECT *,
        rn = ROW_NUMBER() OVER (PARTITION BY Order_number, Amount ORDER BY (SELECT 1))
    FROM Table1
) T1 
LEFT JOIN (
    SELECT *,
        rn = ROW_NUMBER() OVER (PARTITION BY Legacy_Order_number, Amount ORDER BY (SELECT 1))
    FROM Table2
) T2
    ON T2.Legacy_Order_number = T1.Order_number 
        AND T2.Amount = T1.Amount
        AND T2.rn = T1.rn;

推荐阅读