需要 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匹配之外你需要的所有条件。
我正在尝试为以下脚本构建删除查询,该脚本在分组依据中包含多个列。
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匹配之外你需要的所有条件。