0

我需要帮助来构建特定查询。

设想

我有一个带有 pol_id (auto_incremente)、someOtherID 和 someValue 的表 A

表的内容可能如下所示:

pol_id, someOtherID, someValue
--------------------------------
1 5005 我喜欢芝士汉堡
2 5005 我喜欢香蕉
3 6000 在多伦多
4 6018 开门
5 6018 真的
6 6018 炸薯条  

有一个第 3 方软件,它从该表中收集数据。我对操纵软件使用的 sql 语句没有任何影响,因为我无权访问它的源代码。

第 3 方软件选择“someOtherID”为例如 6018 的所有内容,因此它显示 3 个结果。问题是,我只希望显示最后一个结果(具有最高 pol_id)。所以我想我会做一个 cronjob 或做以下事情:

选择每个唯一的 someOtherIDs 降序,删除该表中的所有内容,其中 someOtherID 等于选定的一个和不同的 pol_id

像这样的东西:

伪代码:

select distinct someOtherID, pol_id from A order by pol_id DESC -- 得到最高的

对于每个 someOtherID 作为 selectedLine:

从 A 中删除 someOtherID = selectedLine.someOtherID AND pol_id != selectedLine.pol_id

我想每隔几秒钟运行一次这个语句,或者把它放在触发器或其他东西上,这样表 A 总是干净的

编辑 我从 damien 那里得到了触发解决方案,谢谢大家的回复。

4

4 回答 4

1
;WITH a as
(
 SELECT row_number() over (partition by someOtherID order by pol_id desc) rn 
 FROM tableA
)
DELETE FROM a where rn > 1
于 2013-08-02T12:42:25.433 回答
1

如果您对触发器感到满意:

CREATE TRIGGER T_TableA_I
on TableA
after insert
as
    set nocount on

    delete from a
    from
        TableA a
            inner join
        (select someOtherID,MAX(pol_id) as maxPol from inserted
         group by someOtherID) b
            on
               a.someOtherID = b.SomeOtherID and
               a.pol_id < maxPol

即使有一个包含两行或多行相同的多行插入,它也应该工作someOtherID

于 2013-08-02T12:43:51.407 回答
1
delete from t where 
exists (select 1 from t t1 
                  where t1.someOtherID=t.someOtherID
                  and   t1.pol_id>t.pol_id)

SQLFiddle 演示

于 2013-08-02T12:46:04.010 回答
0

你可以试试这个 Delete A where someOtherID = '6018' and pol_id not in ( Select Max(Pol_id) from A where someOtherID = '6018');

于 2013-08-02T12:53:52.107 回答