You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在SQL Server中使用LEFT JOIN实现每个Order行匹配不重复Item记录?

解决方法:用行号关联实现不重复的LEFT JOIN

这个需求的核心是让每个Order记录匹配不重复的Items表记录,当Items的数量不够时,剩余Order的Item_com显示null。下面是具体的实现思路和代码:

思路拆解

我们需要给两个表的同Item_No分组内的记录分别加行号,然后通过Item_No+行号的组合来关联,这样就能保证每个Items记录只会被用一次,完美匹配你的预期输出。

1. 给Items表添加分组行号

先给Items表按Item_No分组,为每条记录生成一个递增的行号。如果需要随机选取Items记录,就用ORDER BY (SELECT NULL);如果要固定顺序,换成Item_com这类字段就行:

SELECT 
  Item_No,
  Item_com,
  ROW_NUMBER() OVER(PARTITION BY Item_No ORDER BY (SELECT NULL)) AS rn
FROM Items

2. 给Order表添加分组行号

同样给Order表按Item_No分组加行号:

SELECT 
  Item_No,
  Order_on,
  ROW_NUMBER() OVER(PARTITION BY Item_No ORDER BY (SELECT NULL)) AS rn
FROM [Order]

注意:Order是SQL的保留关键字,所以需要用方括号[]把表名括起来避免语法错误。

3. 关联两个带行号的结果集

用LEFT JOIN把两个子查询关联起来,关联条件是Item_No相等且行号rn相等,最后按Order_on排序:

SELECT 
  o.Item_No,
  i.Item_com,
  o.Order_on
FROM (
  SELECT 
    Item_No,
    Order_on,
    ROW_NUMBER() OVER(PARTITION BY Item_No ORDER BY (SELECT NULL)) AS rn
  FROM [Order]
) o
LEFT JOIN (
  SELECT 
    Item_No,
    Item_com,
    ROW_NUMBER() OVER(PARTITION BY Item_No ORDER BY (SELECT NULL)) AS rn
  FROM Items
) i ON o.Item_No = i.Item_No AND o.rn = i.rn
ORDER BY o.Order_on;

测试验证

用你提供的测试数据:

Items表

Item_NoItem_com
11com10
11com11

Order表

Item_NoOrder_on
11100
11200
11300
11400

执行上述SQL后,会得到你想要的预期输出:

Item_NoItem_comOrder_on
11com10100
11com11200
11null300
11null400

额外说明

  • 这个方案支持大多数主流数据库(SQL Server、MySQL 8.0+、PostgreSQL、Oracle等),只要它们支持窗口函数ROW_NUMBER()就行。
  • 如果需要调整Items的匹配顺序,只需要修改子查询里的ORDER BY子句即可,比如换成ORDER BY Item_com DESC来倒序匹配。

内容的提问来源于stack exchange,提问作者hasan81

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.22 09:05:53