2017-08-26 62 views
1

我有一个名为Fruit的表,它有两列(id,cost),我想选择id和cost,并找到所有重复的行,其中的代价是相同的,但id是不同。我该如何编写这个查询?查找具有给定条件的所有重复行

我写这篇文章的查询

SELECT id,cost 
From Fruit a 
WHERE (SELECT COUNT(*) 
     FROM Fruit b 
     WHERE a.cost = b.cost 
) > 1 

这工作,但只给我这里的成本是相同的,但ID可能是相同的,以及,我只想要结果,其中的成本是一样的行,但id为不同

+0

您是否尝试在内部where子句中添加'a.id!= b.id'? –

+0

Madhusudna这是sql所以操作符不等于由<>显示。你不能使用!=。 –

回答

0

这是你所需要的:

SELECT DISTINCT F1.* 
FROM Fruit F1 
INNER JOIN Fruit F2 ON F1.id <> F2.id AND F1.cost = F2.cost 

如果你想得太上市的重复ID-成本对,只是删除DISTINCT

+1

这似乎工作,谢谢 – spyang302

0

您可以选择使用一组由具有ccount(*)> 1

并为此与成本复制的所有行取得与

了所有的行
select a.id, a.cost 
    from Fruit a 
    where cost in (select b.cost 
    from fruit b 
    group by b.cost 
    having count(*) > 1 
) 

为避免重复导致您可以添加不同的

select distinct a.id, a.cost 
    from Fruit a 
    where cost in (select b.cost 
    from fruit b 
    group by b.cost 
    having count(*) > 1 
) 
+0

如果id相同,那么我也会得到这些行,我不确定如何使用此语法来选择相同的费用但使用不同的ID – spyang302

+0

答案已更新,以删除重复的结果。 – scaisEdge

+0

返回带有重复ID的结果,这不是@ spyang302需要的。 – Andrew

0

您可以添加一个简单的条件,其中ID是不相等的。

SELECT标识,成本从果一WHERE(SELECT COUNT(*)FROM果B其中a.cost = b.cost和A.ID <> b.id)> 1

这里<>是运营商不等于。 我希望它能帮助你:)

+0

我试过这个,但它在where子句中不起作用 – spyang302

+0

这不起作用。你实际上应该做'> 0'。并可以在主'SELECT'中添加一个'DISTINCT'。 – Andrew

-1

这个工程。在SQL Server中运行它是因为甲骨文在Fiddle上坏了,但是应该在任一系统上工作。

的MS SQL Server 2014架构设置

CREATE TABLE ab 
    ([id] int, [cost] int) 
; 

INSERT INTO ab 
    ([id], [cost]) 
VALUES 
    (1, 5), 
    (2, 5), 
    (3, 15), 
    (3, 15), 
    (4, 24), 
    (5, 68), 
    (6, 13), 
    (7, 3) 
; 

查询1

with a1 as (
SELECT id 
,cost 
,rank() over (partition by cost order by id) dup 
From ab 
) 

    select * from a1 where dup > 1 

Results

| id | cost | dup | 
|----|------|-----| 
| 2 | 5 | 2 | 

然后返回那里有一个重复的成本都值:

with a1 as (
SELECT id 
,cost 
,rank() over (partition by cost order by id) dup 
From ab 
) 

,a2 as (select * from a1 where dup > 1) 

select * from ab 
join a2 on ab.cost = a2.cost 
+0

spyang302需要得到1-5和2-5,而不是3-15,它们在两个记录中都有相同的id。 – Andrew

+0

哎呀,好点。我改为排名,这将返回1-5,2-5的重复值。如果您正在使用此查询来删除重复项,那应该有效。如果您需要返回两个值,则可以将其加入dup = 2的成本数据集。我将在上面介绍这一点。 – natec

0

您可以添加一个简单的条件,其中id不相等。

SELECT id,cost from Fruit a WHERE(SELECT COUNT(*)FROM Fruit b WHERE a.cost = b.cost and a.id <> b。ID)> 1

这里<>是操作了在SQL 不等于

+0

Prateek,你发布相同的答案两次。 – Andrew

相关问题