用于删除重复的SQL查询

时间:2012-08-22 11:05:28

标签: sql sqlite

考虑我有一个包含id字段的表(不是自动增量)。该字段将包含重复的条目。我想检索该id的不同条目。

考虑我的表是这样的:

id    state   city
1      efef   dfdd
2      dwef   sdfsd
1      fdds   fsdfs

现在我必须检索那个状态为id为1,2的城市。

我试过了这个查询

SELECT * 
FROM   Event 
WHERE  Outletid = (SELECT DISTINCT Outletid FROM Event)

但id为1的数据即将到来(即)带有id的2个数据。有人可以帮忙吗?

4 个答案:

答案 0 :(得分:2)

这应该每ID只返回一条记录。以下查询将使用MIN() id字段返回城市和州的GROUP BY值。由于您有多个ID并且您只想返回一个值,因此这将仅返回满足要求的第一个记录。

select ID, min(city) city, min(state) state
from yourTable
group by ID

请参阅SQL Fiddle with Demo

所以这可以通过以下方式工作

YourTable
ID   city    state
1    efef    dfdd
2    dwef    sdfsd
1    fdds    fsdfs

如果我们获取城市和州列的MIN()值以及GROUP BY ID,则结果为:

YourTable
ID   city    state
1    efef    dfdd
2    dwef    sdfsd

MIN()将返回序列中的最低值。因此,city ID 1 ee开头,f位于GROUP BY之前,因此将会选中它。 ID将匹配的所有select ID, min(city) city, min(state) state from yourTable group by ID having min(city) = max(city) and min(state) = max(state) 合并到一个群集中。

然后,如果您要排除任何具有重复ID的记录,那么您只需将查询更改为:

select min(rowid) rowid, ID, city, state
from yourTable
group by ID

编辑:

您也可以使用:

select *
from yourTable t1
inner join
(
  select min(rowid) row_id, ID
  from yourTable
  group by ID
) t2
  on t1.rowid = t2.row_id
  and t1.id = t2.id

或:

{{1}}

答案 1 :(得分:1)

试试这个:如果你使用的是sql server

由于此表没有主键,因此很难识别要删除的记录。所以你可以做以下

步骤1:

;with cte as(
     select  id   , state,   city,
     row_number() over (partition by id order by (select 0))as row_num
     from <table>)
select * into #tmp
from cte where row_num=1

步骤2:

truncate table <table>

步骤3:

insert into <table>
select * from #tmp

答案 2 :(得分:1)

插入另一个rowID或等效的唯一列

select id,state,city
from Event e1
where e1.rowID in(
   select min(e2.rowID)
   from Event e2
   group by id)

答案 3 :(得分:1)

delete * 
  from mytable 
 where rowid not in (
     select min(rowid) 
       from mytable
      group by column1, column2
     ) -- column1, column2 are the duplicate columns with which we want to group the rows

以上查询是删除所有重复项的通用查询。内部查询将返回重复列(column1,column2)的单行

编辑:请注意上面的查询是在oracle中测试过的。 rowid是由oracle提供给所有行的系统生成的id,并且是唯一的。因此,如果我们在某些列上使用group by并且有三行满足条件,则oracle会将rowid添加为1,2和3。

我确信所有其他数据库都有类似的概念,即在查询的结果数据中添加行号