如何在ms sql server中删除具有2列的多行作为复合主键

时间:2015-08-06 16:07:45

标签: sql sql-server

我有一个名为 ProductLog RequestID的表格。此处Productselect RequestID, Product from ProductLog where Date < '201505161505' EXCEPT select RequestID, Product from ProductLog where Product not in ( select distinct Product from ProductLog where Date > '201505161505' ) 是复合主键。

现在有一种清洁工具可以在几天后清洁产品。显然,清洁是直切的。如果日期少于15天,则删除它。现在出现了一些情况 - 假设有一种产品可以记录18天。现在,如果我们删除的数据少于15天,那么它将删除该产品。每个产品数据都应该存在,因为它用于某些监控目的。现在删除要求已更改。

选择产品。

  • 如果产品在15天内有记录,则保留15天的数据和 删除剩余的。
  • 如果产品记录不在15天内,则不要删除数据。

现在我正在尝试使用像

这样的查询
RequestID

我可以选择应删除的数据。现在我必须删除它。由于ProductIN是复合主键,因此我无法使用catch进行删除。有谁知道我怎么能实现这个目标?

2 个答案:

答案 0 :(得分:2)

如果您只是想根据上面的查询编写删除语句,我会使用EXISTS查询同时处理这两列(RequestIDProduct)。

DELETE
FROM ProductLog
WHERE EXISTS (
        SELECT *
        FROM (
            SELECT RequestID
                ,Product
            FROM ProductLog
            WHERE DATE < '201505161505'

            EXCEPT

            SELECT RequestID
                ,Product
            FROM ProductLog p
            WHERE NOT EXISTS (
                    SELECT *
                    FROM ProductLog p1
                    WHERE p.product = p1.product
                        AND DATE > '201505161505'
                    )
            ) t
        WHERE t.RequestID = ProductLog.RequestID
            AND t.Product = ProductLog.Product
        );

另外,我会在您的子查询中使用NOT EXISTS而不是NOT IN

  

关于NOT EXISTS和NOT IN的最重要的事情是,   与EXISTS和IN不同,它们在所有情况下都不相同。   具体来说,当涉及NULL时,它们将返回不同的值   结果。完全具体,当子查询返回一个时   null,NOT IN将不匹配任何行。

答案 1 :(得分:0)

添加要保留到产品表的天数。然后:

html{
    overflow-y: scroll;
}
.container {
  position: absolute;
  top: 0;
  bottom: 0;
  left: 0;
  right: 0;
  background-color: gray;
}