代码之家  ›  专栏  ›  技术社区  ›  lawd

以所有行值唯一为条件联接表

  •  1
  • lawd  · 技术社区  · 2 周前

    我有桌子 Machine Inventory .在表中 机器 我有上次运行的库存属性。在表中 库存 ,我有新的库存id和属性(尚未在机器中运行)。

    我必须返回一个可能的组合库存列表,这些库存可以根据上次运行的库存在机器中运行。我还需要返回没有重复库存的机器列表。

    对于根据上次运行的库存可以在机器中运行的可能组合库存的列表,我尝试使用 CROSS JOIN 并且它有效[参考1]。

    但对于没有重复库存的机器列表,我不知道该怎么做[参考2]?

    机器 表-具有上次运行库存的机器:

    机器 库存 颜色 大小
    A. 1111 红色 小的
    B 1112 红色 小的
    C 1113 绿色 大的

    库存 表-新库存(尚未在计算机中运行):

    库存 颜色 大小
    1114 红色 小的
    1115 红色 小的
    1116 绿色 大的

    我需要得到每一个组合( Machine CROSS JOIN Inventory 其中颜色和大小匹配)

    SELECT 
        m.Machine, i.Inventory, m.Color, m.Size
    FROM 
        Machine m
    CROSS JOIN 
        Inventory i
    WHERE 
        i.Color = m.Color AND i.Size = m.Size
    
    机器 库存 颜色 大小
    A. 1114 红色 小的
    A. 1115 红色 小的
    B 1114 红色 小的
    B 1115 红色 小的
    C 1116 绿色 大的

    我不需要重复库存(1台机器,1个库存)

    机器 库存 颜色 大小
    A. 1114 红色 小的
    B 1115 红色 小的
    C 1116 绿色 大的

    对于[2],我试图在代码中进行循环,根据Inventory表中的颜色和大小,找到1乘1的机器并进行分配。

    然后排除我已经分配给下一台机器的那个。

    但迭代所有内容需要一些时间。

    1 回复  |  直到 2 周前
        1
  •  2
  •   Squirrel    2 周前

    看起来你想要的不是真的 every combination 但只分配1 machine 到1 inventory .

    您可以使用 row_number() 生成序列号,然后使用该序列号进行连接。

    select m.machine, i.inventory
    from   (
               select machine, color, size, 
                      rn = row_number() over (partition by color, size 
                                                  order by machine)
               from   Machine
           ) m
           inner join
           (
               select inventory, color, size, 
                      rn = row_number() over (partition by color, size 
                                                  order by inventory)
               from   Inventory
           ) i  on  m.color = i.color 
                and m.size  = i.size
                and m.rn    = i.rn