【问题标题】:SQL -joining two table or generating the sequence in a columnSQL - 连接两个表或在一列中生成序列
【发布时间】:2020-12-08 11:57:24
【问题描述】:

我有 2 个表,Table1 有 OrderNo 和 OrderItemId,Table2 有 OrderNo 和 Linenum。我需要制作显示 orderno、orderItemid 和 Linenum 的临时表。我怎样才能达到预期的结果。 如果无法加入,那么我们也可以针对 Order 生成 OrderItemId 数量的序列。假设 Order 有 5 个 OrderItemId,那么我们可以有从 1 到 5 的系列,下一个订单的系列将从 1 开始,直到关联的 Orderitemid 总数。

我试过这个,但系列没有正确生成。它不是明智的

Select Orderitemid, table1.OrderNo,  
SELECT ROW_NUMBER() OVER(ORDER BY table2.ORDERNO ASC)*1000 AS Linenum 
from Table1 inner join Table2
on table1.Orderno = table2.Orderno

【问题讨论】:

  • 在 Table1 和 table 2 中,如果我们添加 price 列并希望与其他列一起显示。只是想确保两个表中的订单价格匹配。任何建议。

标签: sql sql-server tsql


【解决方案1】:

也许你正在寻找这样的东西:

select table1.OrderNo
       , table1.Orderitemid
       , ROW_NUMBER() OVER(partition by table1.OrderNo ORDER BY table1.ORDERNO ASC) AS Linenum 
from Table1 
left join Table2 on table1.OrderNo = table2.OrderNo
group by table1.OrderNo, table1.Orderitemid

您只能对 table2 进行分组:

select table1.OrderNo
       , table1.Orderitemid
       , ROW_NUMBER() OVER(partition by table1.OrderNo ORDER BY table1.ORDERNO ASC) AS Linenum 
from Table1 
left join (select OrderNo 
           from Table2 
           group by OrderNo) table2 on table1.OrderNo = table2.OrderNo

或者只使用 distinct:

select table1.OrderNo
       , table1.Orderitemid
       , ROW_NUMBER() OVER(partition by table1.OrderNo ORDER BY table1.ORDERNO ASC) AS Linenum 
from Table1 
left join (select distinct OrderNo 
           from Table2 ) table2 on table1.OrderNo = table2.OrderNo

或者如果table2没有连接就不想生成Linenum的话可以加case when then else end

select table1.OrderNo
       , table1.Orderitemid
       , case when table2.OrderNo is not null then
                  ROW_NUMBER() OVER(partition by table1.OrderNo ORDER BY table1.ORDERNO ASC)
              else
                  null
              end Linenum
from Table1 
left join (select distinct OrderNo 
           from Table2 ) table2 on table1.OrderNo = table2.OrderNo

这是一个演示:

DEMO

【讨论】:

  • 不客气,我很乐意提供帮助。干杯!
  • 唯一的问题,现在如果 Orderno 不在表 2 中,那么它不应该生成序列。但它是 。如果我按照 Gordon 的建议使用案例,那么 group by 会给出错误
  • 您不想在示例中获得 3000 的结果?
  • @Sbanga 请在此处查看最后一个查询:dbfiddle.uk/…
  • 对不起 打错了,我打开页面再写一些查询
【解决方案2】:

我认为你只需要一个case 表达式:

Select Orderitemid, table1.OrderNo,
       (case when t2 is not null
             then row_number() over (partition by t1.orderno order by t1.orderitemid)
        end) as linenum
from Table1 t1 left join
     (select distinct t2.orderno
      from Table2 t2
     ) t2
     on t1.Orderno = t2.Orderno;

也就是说,当第二个表中有匹配项时,您只需要行号。

【讨论】:

  • 它给了我 Cristian 的结果。它应该只显示 2 行,但它显示 4 OrderNo OrderItemId LineNum 1000 101 1 1000 101 2 1000 102 1 1000 102 2
  • @Sbanga 。 . .我错过了您在第二个表中有重复项。我更新了答案。
猜你喜欢
  • 2021-05-30
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-09-25
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多