2015-11-03 66 views
0

我有一个表:TENDERINFO。有列OrderNo,Tender,TenderSequence在oracle中添加序列a列

我需要更新TenderSequence从1开始,直到订单号中的订单项数量。

我该如何做到这一点?

回答

0

所以我们打算通过OrderNo进行行编号“分组”。我无法判断Tender或TenderSequence是否可以作为数据的排序列,因此我只是使用OrderNo来完成。这表明越来越使用窗口函数ROW_NUMBER()的ROWNUMBER:

select 
    OrderNo, Tender, TenderSequence, 
    row_number() over (partition by OrderNo order by OrderNo asc) rownumber, 
    TenderSequence + row_number() over (partition by OrderNo order by OrderNo asc) TS_RowNum_ADD 
from 
    TENDERINFO 
0
WITH cte as (
    SELECT OrderNo, 
      Tender, 
      ROW_NUMBER() OVER (ORDER BY OrderNo) as rn, 
      ROW_NUMBER() OVER (PARTITION BY OrderNo ORDER BY OrderNo) as rn2 
    FROM TENDERINFO 
    ) 
UPDATE TENDERINFO T 
SET TenderSequence = (SELECT c.rn 
         FROM cte c 
         WHERE c.OrderNo = T.OrderNo 
         AND c.Tender = T.Tender 
        ) 

不知道这ROW_NUMBER需要。

在你的问题是不明确的,如果你可以为每个OrderNo

多个Tender在这种情况下,你可以使用

OVER (ORDER BY OrderNo, Tender) 

OVER (ORDER BY OrderNo, TenderSequence) 
+0

'update x inner join y'在Oracle中不是有效的语法。它可以在SQL Server中完美工作。 –

+0

@JustinCave是的,我刚刚看到。我从问题中复制syntaxis而不是正确答案:(... –

0

如果你只是想要用一个序列设置表,从最小的OrderNo到number_of_rows的1开始到最大的OrderNo,下面的查询可以实现它:

merge into tenderinfo t 
    using (
    select 
     orderno, 
     rownum rn 
     from (select orderno from TENDERINFO order by orderno) 
) seq on (seq.orderno = t.orderno) 
    when matched then 
    update set t.tendersequence = seq.rn ;