rav*_*vi 5 sql-server sql-server-2008
我有一个关于SQL Server的问题.
表: emp
empid | name |sal
1 | abc |100
2 | def |200
3 | test |300
2 | har |500
3 | jai |600
4 | kali |240
Run Code Online (Sandbox Code Playgroud)
这个表有基于上表的重复数据我希望从emp表中删除重复数据
并且应该将重复数据加载到empduplicate表中.
这empid是独一无二的.如果empid多次显示,则该记录被视为重复.
empduplicate 结构看起来像这样:
Empid | name | sal
Run Code Online (Sandbox Code Playgroud)
最后删除重复数据后,我希望看到emp表中的数据如下所示:
empid | name | sal
1 | abc | 100
4 | kali | 240
Run Code Online (Sandbox Code Playgroud)
为了删除重复项,我尝试了这段代码:
;with duplicate as
(
select
*,
row_number()over (partition by empid order by empid) as rn
from emp
)
delete from duplicate
where rn > 1
Run Code Online (Sandbox Code Playgroud)
但我无法删除整个记录.
示例:empid=2具有重复数据
empid|name |sal
2 |def |200
2 |har |500
Run Code Online (Sandbox Code Playgroud)
我需要删除整个empid=2相应的记录.empid=2有重复,需要从emp表中删除它.
并且empduplicate表需要加载重复数据,如下所示:
empid | name |sal
2 |def |200
2 |har |500
3 |test |300
3 |jai |600
Run Code Online (Sandbox Code Playgroud)
为了插入重复数据,我试过这段代码:
insert into empduplicate
select
id, name, sal
from
emp
group by
id
having
count(*) > 1
Run Code Online (Sandbox Code Playgroud)
该查询引发错误:
列'duplicate.name'在选择列表中无效,因为它不包含在聚合函数或GROUP BY子句中.
请告诉我如何编写查询以在SQL Server中实现我的任务
你快到了。不要使用ROW_NUMBER,而是使用COUNT:
WITH CteInsert AS(
SELECT *,
cnt = COUNT(empid) OVER(PARTITION BY empid)
FROM emp
)
INSERT INTO empduplicate(empid, name, sal)
SELECT
empid, name, sal
FROM CteInsert
WHERE cnt > 1;
WITH CteDelete AS(
SELECT *,
cnt = COUNT(empid) OVER(PARTITION BY empid)
FROM emp
)
DELETE FROM CteDelete WHERE cnt > 1;
Run Code Online (Sandbox Code Playgroud)
您需要INSERT在 之前执行第一个DELETE。此外,您可能希望将其包含在单个事务中。
| 归档时间: |
|
| 查看次数: |
160 次 |
| 最近记录: |