我有一张表如下:
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查询。有人帮忙吗?
答案 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来表示婚姻状况
答案 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
LIKEyourTable
; 插入tmpTable
(col1
,col2
...colN
)SELECT distinctcol1
,col2
...colN
FROMyourTable
在哪里1; 删除表yourTable
; RENAME TABLEtmpTable
至yourTable
;
请注意,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 等