我有一个包含多个条目的表,我想删除一个或多个

时间:2019-03-11 07:24:06

标签: sql sql-server

我有一个表,其中有多个使用相同日期的条目,并且我想删除其中的一个或多个。删除将基于第二个表中的值。这是一个例子。

表1:

Row Customer   Task   Frequency   Date mm/dd/yy
1   A          X      1           07/01/19
2   A          X      1           08/01/19
3   A          X      1           09/01/19
4   A          Y      3           09/01/19
5   A          X      1           10/01/19
6   A          W      1           10/01/19
7   A          X      1           11/01/19
8   A          X      1           12/01/19
9   A          Y      3           12/01/19
10  A          Z      12          12/01/19

此影响数据来自表2,按任务链接:

Task   Group   Frequency   Priority
X      A       1           1
Y      A       3           2
Z      A       12          3
W      B       10          1

任务是删除表1中的行,其中所有行都使用同一位客户,在同一日期,在表2中属于同一组并且在表2中具有较低的优先级。因此,在上述示例中,表1中的以下行将被删除:

3它属于同一组,与第4行在同一日期,但优先级较低

8&9它们属于同一组,并且与第12行的日期相同,但是优先级较低

第6行不会被删除,因为它具有相同的日期等,但属于不同的组。

表1现在看起来像这样(行号纯粹是为了帮助理解问题):

Row Customer   Task    Frequency   Date mm/dd/yy
1   A          X       1           07/01/19
2   A          X       1           08/01/19
3   A          Y       3           09/01/19
4   A          X       1           10/01/19
5   A          W       1           10/01/19
6   A          X       1           11/01/19
7   A          Z       12          12/01/19

1 个答案:

答案 0 :(得分:0)

请尝试使用以下脚本(请进行测试(因为我现在无法访问任何SQL Server来验证任何语法错误)-

;WITH CTE AS (
    SELECT
        RowIndexing = (ROW_NUMBER() OVER (PARTITION BY T1.Customer, T1.Date, T2.Group ORDER BY T2.Priority DESC)),
        T1.Row
    FROM Table1 T1
    INNER JOIN Table2 T2 ON T2.Task = T1.Task
)
--DELETE T1
SELECT T1.*
FROM Table1 T1
INNER JOIN CTE ON CTE.Row = T1.Row
WHERE CTE.RowIndexing > 1

在下面添加新的解决方案(假设表中不存在Row列)-

;WITH CTE AS (
    SELECT
        RowIndexing = (ROW_NUMBER() OVER (PARTITION BY T1.Customer, T1.Date, T2.Group ORDER BY T2.Priority DESC)),
        T1.Customer,
        T1.Task,
        T1.Frequency,
        T1.Date
    FROM Table1 T1
    INNER JOIN Table2 T2 ON T2.Task = T1.Task
)
--DELETE T1
SELECT T1.*
FROM Table1 T1
INNER JOIN CTE ON CTE.Customer = T1.Customer AND CTE.Task = T1.Task AND CTE.Frequency = T1.Frequency AND T1.Date = CTE.Date
WHERE CTE.RowIndexing > 1

以上解决方案将返回行,如果您取消注释delete行并在其下方注释掉select行,则会删除这些行。