sql - 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 |
解决方案
您可以为每个表添加分区行号,然后将行号添加为连接条件
这意味着每行仅与匹配行连接一次,同时仍保持Order_number
和Amount
作为主要连接条件。
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;
推荐阅读
- graphviz - Graphviz - 如何为每个子图设置不同的布局?
- javascript - javascript 对象方法中的新构造函数
- javascript - Azure http-trigger 函数使用 multipart/form-data 查询 HTTP POST 请求
- node.js - 在 NodeJS netlify-lambda 上运行的 Lambda 函数出错 — “TypeError: Expected signal to be an instanceof AbortSignal”
- java - 我如何在 Spring Boot 中使用 Query 和 Pageable
- mysql - 连接到 MySql 导致“连接被拒绝,没有更多信息”
- c# - 如果不活动,gRPC 连接会在 60 秒后断开
- c# - JsonSerializer 似乎忽略了时区偏移
- python - 无法将我的 Kivy 应用程序打包成 EXE。Error = (2, 'LoadLibraryExW', '系统找不到指定的文件。')
- javascript - 如何创建错误的子类型来抛出它?