2017-08-03 15 views
1

假設我是一個萌芽的口袋妖怪卡收集器,並且我使用SQL數據庫來跟蹤我的卡片。我給Pokemon的每個種類分配一個號碼,id。我想跟蹤訂單我收集每種類型,所以我也爲每張卡分配一個序列號seqno。我在貨架上展示這些卡片。如何在`delete from ... into`查詢中增加次序號?

create table shelf (
    kind_id int not null, 
    seqno int not null 
) 

insert into shelf values (0, 1), 
         (0, 2), 
         (0, 3), 
         (1, 1), 
         (1, 2) 

我只抓到了兩種口袋妖怪:三種第一種和兩種第二種。

當我去收集更多的卡,我把它們扔在一個袋子裏。

create table bag (
    kind_id int not null, 
) 

insert into bag values (0), 
         (0), 
         (1), 
         (2) -- woot, caught a new one 

很容易我所有的卡從包裏貨架移動...

delete from bag 
output deleted.kind_id, -1 
into shelf (kind_id, seqno) 
select * from bag 

...然後使用-1提醒我要設置序列號,但我厭倦了手動設置。

我也是一個非常type-A編碼器,我不想編寫第二個查詢來更新序列號。我希望這一切都發生在「從包到貨架」的查詢中。

我知道這些限制聽起來很奇怪。我試圖提煉出一個更復雜的問題,所以希望這個故事有所幫助。

+1

你的第一次插入到架子看起來像2卡,你說它是第一種和第二種之一第二?但它看起來像第一個3和第二個2。另外他們爲什麼分享seqnum?不應該更像'(0,1)(1,2)(1,3)'?還是你想seqnum只增加每個ID?無論哪種方式,我很困惑5插入= 3卡(我得到2個ID) –

+1

不要從'bag'中刪除。添加一個'shelfId'列。袋子包含那些不是'NULL'的。 –

+0

@Aaron Dietz你是對的,第一個3,第二個2,感謝你的支持。是的,我只希望seqnum每個ID增加,而不是整個表。 – mac9416

回答

2

更改您的刪除到插入然後刪除。使用子查詢從貨架中查找MAX(seqnum)(與正確的ID相關),並在插入期間增加它。包裹子查詢中ISNULL('',1)在1新卡開始SEQNUM,(或在SEQNUM列使用默認值約束):

SELECT b.kind_id, 
     ISNULL(seqno + ROW_NUMBER() OVER (PARTITION BY b.kind_id ORDER BY b.kind_id),1) 
FROM bag b 
LEFT JOIN (SELECT MAX(seqno) seqno, kind_id 
      FROM shelf 
      GROUP BY kind_id) s on s.kind_id = b.kind_id 

然後,只需DELETE FROM bag

+1

isnull函數應該默認爲1. – KeithL

+0

當包中有多個特定類型的卡時,這將重複序列號。 HTTP:// rextester。com/UJDGL4461 – mac9416

+0

哎呦,讓我解決這個問題。 –

0

窗口功能

select id 
    , row_number over (partition by id, order by id) as autoSeqno 
from shelf 

或只是使用包的基表,並不要刪除它