2017-08-26 88 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