2

考虑我有一个包含 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

4 回答 4

2

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

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

请参阅带有演示的 SQL Fiddle

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

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

如果我们取MIN()city 和 state 列的值以及GROUP BYid 你的结果将是:

YourTable
ID   city    state
1    efef    dfdd
2    dwef    sdfsd

MIN()将返回序列中的最低值。因此,由于citywith the IDof以 and1开头e并且e在此之前f,它将被选中。GROUP BY将所有匹配的内容组合ID成一个集群。

然后,如果您想排除任何具有重复 id 的记录,那么您可以将查询更改为:

select ID, min(city)  city, min(state)   state
from yourTable
group by ID
having min(city) = max(city)  
   and min(state) = max(state)

编辑:

您还可以使用:

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
于 2012-08-22T11:45:50.450 回答
1

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

select id,state,city
from Event e1
where e1.rowID in(
   select min(e2.rowID)
   from Event e2
   group by id)
于 2012-08-22T11:22:44.470 回答
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 添加到它们。

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

于 2012-08-22T11:24:50.117 回答
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>

第三步:

insert into <table>
select * from #tmp
于 2012-08-22T11:19:22.490 回答