如何使用SQL查询从表中删除重复项

时间:2011-10-06 14:49:30

标签: sql tsql

我有一张表如下:

emp_name   emp_address  sex  matial_status  
uuuu       eee          m    s
iiii       iii          f    s
uuuu       eee          m    s

我想根据3个字段emp_name,emp_address和sex删除重复的条目。 我的结果表(删除重复项后)应该看起来像 -

emp_name    emp_address   sex   marital_status
uuuu        eee           m     s
iiii        iii           f     s

我无法回想起如何为此编写SQL查询。有人帮忙吗?

8 个答案:

答案 0 :(得分:5)

我会创建一个新表,其中包含要保持唯一的列的唯一索引。然后从旧表插入到新表中,忽略有关重复行的警告。最后,我会删除(或重命名)旧表并将其替换为新表。在MySQL中,这看起来像

CREATE TABLE tmp LIKE mytable;
ALTER TABLE tmp ADD UNIQUE INDEX myindex (emp_name, emp_address, sex, marital_status);
INSERT IGNORE INTO tmp SELECT * FROM mytable;
DROP TABLE mytable;
RENAME TABLE tmp TO mytable;

或类似的东西(这是完全未经测试的)。

答案 1 :(得分:4)

这不是查询,而是删除语句。它将删除/删除表中的重复行

;with C as
(
  select row_number() over(partition by DUPLICATE_VAARS_DECISION 
                           order by NODE_EQ_NO) as rn
  from yourtable
)
delete C
where rn > 1

如果您只对查询表格感兴趣并获得非重复项,则应使用此代码。

;with C as
(
  select *,
         row_number() over(partition by DUPLICATE_VAARS_DECISION 
                           order by NODE_EQ_NO) as rn
  from yourtable
)
select *
from C
where rn = 1

答案 2 :(得分:2)

单程

select emp_name,   emp_address,  sex,  max(marital_status) as marital_status
from Yourtable
group by emp_name,   emp_address,  sex

由于我不知道你想要什么,我用max来表示婚姻状况

有关更多示例,请参阅Including an Aggregated Column's Related Values

答案 3 :(得分:1)

看起来所有四列值都是重复的,所以你可以这样做 -

select distinct emp_name, emp_address, sex, marital_status
from YourTable

但是,如果婚姻状况可能不同,并且您有一些其他列可供选择(例如,您希望基于列create_date的最新记录),则可以执行此操作

select emp_name, emp_address, sex, marital_status
from YourTable a
where not exists (select 1 
                   from YourTable b
                  where b.emp_name = a.emp_name and
                        b.emp_address = a.emp_address and
                        b.sex = a.sex and
                        b.create_date >= a.create_date)

答案 4 :(得分:0)

如果您可以通过交易空间获得性能和简单性,那么可以通过使用emp_name | emp_address | sex TSQL方法和{{1}引入计算/派生列来消除CHECKSUM()组合中的重复项查询时的关键字。

以下是CHECKSUM的一个例子:

DISTINCT

Google围绕并创建一个包含3列校验和的依赖列。 然后,您可以通过查看at this question

来选择不同的行

答案 5 :(得分:0)

最佳答案如下:
使用此SQL语句来标识额外的重复行:

 select * from Employee a 
where %%physloc%% >
(select min(%%physloc%%) from Employee b
where a.emp_name=b.emp_name and a.emp_address=b.emp_address and a.sex=b.sex);

你会得到额外的一行:

uuuu   eee m   s 


使用此SQL语句删除多余的重复行:

 delete from Employee a 
where %%physloc%% >
(select min(%%physloc%%) from Employee b
where a.emp_name=b.emp_name and a.emp_address=b.emp_address and a.sex=b.sex);


对于所有重复记录,仅保留物理位置最低的记录。此方法可用于删除所有类型的重复行。

我假设您使用的是MS SQL Server。如果您使用的是Oracle DB,那么您只需要替换' %% physloc %% '使用' rowid '

享受密码!

答案 6 :(得分:0)

我知道这是旧帖子,但最近我测试了一个解决方案并希望分享,如果有人能找到我的解决方案有帮助 -

  

CREATE TABLE tmpTable LIKE yourTable;   插入tmpTablecol1col2 ... colN)SELECT distinct col1col2 ... colN FROM yourTable在哪里1;   删除表yourTable;   RENAME TABLE tmpTableyourTable;

请注意,insert into语句可以在没有主键的情况下执行。

感谢。

答案 7 :(得分:0)

如果您对不同的尝试不满意

SELECT MAX(ID) AS MaxRecordID, max(FirstName) AS fname
    FROM [SampleDB].[dbo].[Employee]
    GROUP BY [FirstName], 
             [LastName], 
             [Country]

在 groupBy 中使用 Max 关键字。您可以将 max 用于任何类型的列。整数、Varchar 等