需要 SQL 用于 group by 和 having 子句的删除脚本

Need a SQL delete script for group by and having clause

我正在尝试为以下脚本构建删除查询,该脚本在分组依据中包含多个列。

select Test_1,Test_2,Test_3,Test_4,Test_5,Test_6,Test_7,Test_8,Test_9,
Test_10,Test_11,Test_12,Test_13,Test_14,Test_15,Test_16,Test_17,Test_18,Test_19,Test_20,
Test_21,Test_22,Test_23,Test_24,Test_25,Test_26,Test_27,Test_28,Test_29,Test_30 from Test_Table
where PROS_Test='236458' 
group by Test_1,Test_2,Test_3,Test_4,Test_5,Test_6,Test_7,Test_8,Test_9,
Test_10,Test_11,Test_12,Test_13,Test_14,Test_15,Test_16,Test_17,Test_18,Test_19,Test_20,
Test_21,Test_22,Test_23,Test_24,Test_25,Test_26,Test_27,Test_28,Test_29,Test_30
having count(*)>1 

select 查询的总计数为 102100,我需要相同的删除查询。

使用子查询尝试 delete 语句:

delete tt 
from (
    select row_number() over (partition by Test_1,Test_2,Test_3,Test_4,Test_5,Test_6,Test_7,Test_8,Test_9,
    Test_10,Test_11,Test_12,Test_13,Test_14,Test_15,Test_16,Test_17,Test_18,Test_19,Test_20,
    Test_21,Test_22,Test_23,Test_24,Test_25,Test_26,Test_27,Test_28,Test_29,Test_30 order by Test_1) rn
    from Test_Table
    where PROS_Test='236458'
) tt where rn > 1

您可以用您的查询创建一个 cte 并在删除命令中使用它:

with cte as (
    select Test_1,Test_2,Test_3,Test_4,Test_5,Test_6,Test_7,Test_8,Test_9,
    Test_10,Test_11,Test_12,Test_13,Test_14,Test_15,Test_16,Test_17,Test_18,
    Test_19,Test_20,Test_21,Test_22,Test_23,Test_24,Test_25,Test_26,
    Test_27,Test_28,Test_29,Test_30 from Test_Table
    where PROS_Test='236458' 
    group by Test_1,Test_2,Test_3,Test_4,Test_5,Test_6,Test_7,Test_8,Test_9,
    Test_10,Test_11,Test_12,Test_13,Test_14,Test_15,Test_16,Test_17,Test_18,
    Test_19,Test_20,Test_21,Test_22,Test_23,Test_24,Test_25,Test_26,
    Test_27,Test_28,Test_29,Test_30
    having count(*) > 1 
)
delete t
from Test_Table as t
INNER JOIN cte as c ON t.Test_1 = c.Test_1 ...

以及除了Test_1匹配之外你需要的所有条件。