2013-08-19 69 views
0

我有一個4列的表格:允許具有相同GUID的最多10個項目

ID,GUID,二進制,時間戳。

我的目標是將二進制文件的最近10次修改保存到數據庫中。如果插入第11個修改,則應刪除最早的修改。

我目前的做法是做的兩個步驟(僞MSSQL):一個聲明

1) DELETE FROM mytable WHERE GUID = 'XXX' AND 
    ID NOT IN (SELECT TOP 9 ID FROM mytable WHERE GUID = 'XXX' ORDER BY Timestamp) 

2) INSERT new binary ... 

有沒有辦法做到這一點更有效,也許?有沒有辦法讓mssql和postgresql兼容(沒有TOP/Limit)?

回答

2

我認爲下面的意志在SQL Server和Postgres中都可以工作:

with todelete as (
     select id, row_number() over (partition by GUID order by timestamp) as seqnum 
     from mytable 
     where GUID = 'xxx' 
    ) 
delete from mytable 
    where id in (select id from todelete where seqnum > 10); 
+0

+1,事實證明,從cte刪除不工作在PostgreSQL :( –

+0

謝謝,我可以執行一個插入沒有第二個查詢? – VladL

+0

@RomanPekar ...它在SQL小提琴(http:// www .sqlfiddle.com /#!12/f1107/1)。 –

3

你可以使用CTE兼容性:

with cte as (
    select 
     row_number() over(order by Timestamp desc) as row_num 
    from mytable 
    where GUID = 'XXX' 
) 
delete from cte 
where row_num > 10 

編輯
看到戈登·利諾夫答案,我的語法是不是在PostgreSQL的工作,只是測試它在sqlfiddle。我的工作太多與SQL Server ...

EDIT2
關於刪除,並在一個查詢中插入,PostgreSQL允許認爲:

with cte_del as (
    select 
     id, 
     row_number() over(order by id desc) as row_num 
    from tbl 
    where GUID = 'XXX' 
), cte_d as (
    delete from tbl where id in (select id from cte_del where row_num > 10) 
) 
insert into ... 
select id from cte_del where row_num <= 10; 

sql fiddle demo

+0

謝謝,我還可以做一個inse rt沒有第二個查詢? – VladL

+0

我不這麼認爲,幾乎可以肯定你不能在PostgreSQL和SQL Server中使用查詢來做到這一點 –

+0

@VladL查看更新回答 –

相關問題