2012-01-11 40 views
3

我有下面的模式的表格:查詢用於發現複製

CUSTOMERS (id INT, name VARCHAR(10), height VARCHAR(10), weight INT)

id是主鍵。我想找出哪些人的姓名完全相同,身高相同,體重相同。換句話說,我想找出與nameheightweight重複。

示例表:

1, sam, 160, 100 
2, ron, 167, 88 
3, john, 150, 90 
4, sam, 160, 100 
5, rick, 158, 110 
6, john, 150, 90 
7, sam, 166, 110 

輸出示例:

既然現在還有人用相同的名字,相同的高度和相同的權重:

sam (id=1), sam (id=4)

john (id=3), john (id=6)

我想要得到這些ID。如果我每場比賽只得到一個id(即第一場比賽的id = 1,第二場比賽的id = 3),那也沒問題。


我正在嘗試此查詢,但不知道它是否正確。

SELECT id 
FROM customers 
GROUP BY name, height, weight 
+0

可能重複的HTTP ://stackoverflow.com/questions/59232/how-do-i-find-duplicate-values-in-a-table-in-oracle) – Ollie 2012-01-11 10:08:29

回答

2

試試這個(有效期爲SQL Server):

SELECT 
    t.NAME, 
    'Ids = '+ 
    (
     SELECT cast(Id as varchar)+',' 
     FROM Customers c 
     WHERE c.NAME = t.NAME AND c.Weight = t.Weight AND c.Height = t.Height 
     FOR XML PATH('') 
    ) 
FROM 
(
    SELECT Name, height, weight 
    FROM Customers 
    GROUP BY Name, height, weight 
    HAVING COUNT(*) > 1 
) t 

OR

,你問 - 每場比賽

SELECT 
    t.NAME, 
    c.Id 
FROM 
(
    SELECT Name, height, weight 
    FROM Customers 
    GROUP BY Name, height, weight 
    HAVING COUNT(*) > 1 
) t 
JOIN Customers c ON t.NAME AND c.Weight = t.Weight AND c.Height = t.Height 
1

你是在正確的道路:

SELECT min(id) 
FROM customers 
GROUP BY name, height, weight 
HAVING COUNT(*) > 1 
+0

我不認爲這會以這種方式工作,因爲你有將id字段放在group by子句中。 – TheBoyan 2012-01-11 09:53:26

+0

ouch,你是對的,更新。 – 2012-01-11 10:06:17

2
SELECT * 
FROM customers C 
INNER JOIN 
(
    SELECT name, height, weight 
    FROM customers 
    GROUP BY name, height, weight 
    HAVING COUNT(*) > 1 
) X ON C.name = X.name AND C.height = X.height AND C.weight = X.weight 
+0

這應該起作用。我建議使用DuplicateCustomers而不是X作爲內部選擇表名稱。 – 2012-01-11 10:08:00

+0

你絕對正確我的朋友。我只是沒有注意到它,因爲它只是一個簡單的例子。 Teşekkürler:) – Baatar 2012-01-11 10:58:48

1
SELECT c.* 
FROM customers c 
JOIN (
    SELECT name, height, weight 
    FROM 
    GROUP BY name, height, weight 
    HAVING count(*) > 1 
) t ON c.name = t.name and c.height = t.height and c.weight = t.weight 
1

只有一個編號,我不知道,因爲你標記的幾個數據庫,你使用的是什麼。

在Sql服務器中,如果不將它放入SELECT中,您將無法選擇該ID。

所以,如果你想選擇其他字段,除了羣組中的類別,你可以使用PARTITION BY。類似這樣的:

SELECT id, 
ROW_NUMBER() OVER(PARTITION BY c.name, c.height, c.weight ORDER BY c.name) AS DuplicateCount 
FROM customers c 

這會給你你有同名,高度和重量的重複的ID。
雖然我不確定這是否比其他解決方案更快,但是,您可以對其進行配置並進行比較。

0

如果它是好的,正如你所說的得到每場比賽只有一個ID,你接近的解決方案:

SELECT 
    min(id) 
    ,name, height, weight --<-- oncly if you need/want 
FROM customers 
GROUP BY name, height, weight 
HAVING count(*) > 1 
的[?如何找到在Oracle中的表中的重複值(