2009-01-12 75 views
24

下面的查詢將顯示已複製的「書」表中的所有杜威十進制數:如何在數據庫表中查找重複條目?

SELECT dewey_number, 
COUNT(dewey_number) AS NumOccurrences 
FROM book 
GROUP BY dewey_number 
HAVING (COUNT(dewey_number) > 1) 

然而,我想要做的是有我的查詢與顯示相關的作者的名字重複的條目(「書」表和「作者」表由「author_id」連接)。換句話說,上述查詢將產生以下類似以下

dewey_number | NumOccurrences 
------------------------------ 
5000   | 2 
9090   | 3 

我想要什麼結果來顯示的東西:

author_last_name | dewey_number | NumOccurrences 
------------------------------------------------- 
Smith   | 5000   | 2 
Jones   | 5000   | 2 
Jackson   | 9090   | 3 
Johnson   | 9090   | 3 
Jeffers   | 9090   | 3 

任何幫助,您可以提供非常讚賞。而且,如果它起作用,我使用Postgresql DB。

UPDATE請注意,「author_last_name」不在「book」表中。

+0

重複http://stackoverflow.com/questions/18932/sql-how-can-i-remove-duplicate-rows有人可以關閉嗎? – 2009-01-12 16:28:29

+5

請仔細閱讀。這不是重複的。 – Huuuze 2009-01-12 16:41:59

+0

根本不重複。他希望*找到重複的行(以及更多),而不是刪除它們。 – 2009-01-12 16:45:03

回答

21

嵌套查詢可以做的工作。

SELECT author_last_name, dewey_number, NumOccurrences 
FROM author INNER JOIN 
    (SELECT author_id, dewey_number, COUNT(dewey_number) AS NumOccurrences 
     FROM book 
     GROUP BY author_id, dewey_number 
     HAVING (COUNT(dewey_number) > 1)) AS duplicates 
ON author.id = duplicates.author_id 

(我不知道這是不是達到你想要的最快的方法)

更新:這是我的數據

SELECT * FROM author; 
id | author_last_name 
----+------------------ 
    1 | Fowler 
    2 | Knuth 
    3 | Lang 

SELECT * FROM book; 
id | author_id | dewey_number |   title   
----+-----------+--------------+------------------------ 
    1 |   1 |   600 | Refactoring 
    2 |   1 |   600 | Refactoring 
    3 |   1 |   600 | Analysis Patterns 
    4 |   2 |   600 | TAOCP vol. 1 
    5 |   2 |   600 | TAOCP vol. 1 
    6 |   2 |   600 | TAOCP vol. 2 
    7 |   3 |   500 | Algebra 
    8 |   3 |   500 | Undergraduate Analysis 
    9 |   1 |   600 | Refactoring 
10 |   2 |   500 | Concrete Mathematics 
11 |   2 |   500 | Concrete Mathematics 
12 |   2 |   500 | Concrete Mathematics 

這裏是的結果上述查詢:

author_last_name | dewey_number | numoccurrences 
------------------+--------------+---------------- 
Fowler   |   600 |    4 
Knuth   |   600 |    3 
Knuth   |   500 |    3 
Lang    |   500 |    2 
+0

好吧,可能是一個嵌套的查詢是矯枉過正,但現在我確定它的工作原理。 Tony Andrews對author_id專欄的評論也適用於此。 – 2009-01-12 17:07:39

20

你可能想這

SELECT dewey_number, author_last_name, 
COUNT(dewey_number) AS NumOccurrences 
FROM book 
GROUP BY dewey_number,author_last_name 
HAVING (COUNT(dewey_number) > 1) 
+1

「author_last_name」不在「book」表中。 「書」表和「作者」表通過「book」表中的FKed「author_id」連接。 – Huuuze 2009-01-12 16:27:12

2
SELECT dewey_number, author_last_name, 
     COUNT(dewey_number) AS NumOccurrences 
FROM book 
JOIN author USING (author_id) 
GROUP BY dewey_number,author_last_name 
HAVING COUNT(dewey_number) > 1 

如果書。 AUTHOR_ID可以爲空,然後改變連接到:

LEFT OUTER JOIN author USING (author_id) 

如果AUTHOR_ID列在每個表不同的名字,那麼你不能使用通過,而是使用ON:

JOIN author ON author.id = book.author_id 

LEFT OUTER JOIN author ON author.id = book.author_id 
0
select author_name,dewey_number,Num_of_occur 
from author a,(select author_id,dewey_number,count(dewey_number) Num_of_occur 
       from book 
       group by author_id,dewey_number 
       having count(dewey_number) > 1) dup 
where a.author_id = dup.author_id 
0

最簡單的方式efective我發現是下面顯示:

SELECT 
    p.id 
    , p.full_name 
    , (SELECT count(id) FROM tbl_documents as t where t.person_id = p.id) as rows 
FROM tbl_people as p 
WHERE 
    p.id 
IN (SELECT d.person_id FROM tbl_documents as d 
    GROUP BY d.person_id HAVING count(d.id) > 1) 
ORDER BY 
    p.full_name