考虑我有一个包含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个数据。有人可以帮忙吗?
答案 0 :(得分:2)
这应该每ID
只返回一条记录。以下查询将使用MIN()
id字段返回城市和州的GROUP BY
值。由于您有多个ID
并且您只想返回一个值,因此这将仅返回满足要求的第一个记录。
select ID, min(city) city, min(state) state
from yourTable
group by ID
所以这可以通过以下方式工作
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
e
以e
开头,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。
我确信所有其他数据库都有类似的概念,即在查询的结果数据中添加行号