2015-11-03 19 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 ;