2016-10-20 206 views
0

我有一个这样的talble ..查找重复在SQL Server

BookId  BookName          BookProvider 

1     Angels and deamons      Amazon 
2     Angels and deamons      Amazon 
3     Angels and deamons      Ebay 
4     Tuesdays        Amazon     
5     SQL 101         Ebay      

我想发现是相同的,存在于多个唯一BookProvider所有的书名,我该怎么办,在一个SQL查询?在这个例子中,我想检索记录1和2,因为书名是相同的,它可以在亚马逊和eBay上找到。

+0

是否要在结果中包含BookProviders? – jarlh

+0

你可以举一个例子或更多的细节,它不明确 – mhmd

+1

你想要第1和第2行吗?不是3? – jarlh

回答

1

此方法返回多行所有书籍一样BookProvider:

WITH cte AS 
(
    SELECT *, COUNT(*) OVER (PARTITION BY BookProvider, BookName) AS cnt 
    FROM @BookTable TT 
) 
SELECT * 
FROM cte 
WHERE cnt > 1; 
+0

谢谢,这解决了我的问题:) – MTplus

5

试试这个

select BookName from table 
group by BookName 
having count(distinct BookProvider)>1 
0
DECLARE @BookProvider TABLE(
    Id int 
    ,BookName VARCHAR(100) 
    ,BookProvider VARCHAR(100) 
) 

INSERT INTO @BookProvider 
VALUES(1, 'Angels and Demons', 'Amazon') 
INSERT INTO @BookProvider 
VALUES(2, 'Angels and Demons', 'Ebay') 
INSERT INTO @BookProvider 
VALUES(3, 'Tuesdays', 'Amazon') 
INSERT INTO @BookProvider 
VALUES(4, 'SQL 101', 'Ebay') 

SELECT BookName, COUNT(DISTINCT BookProvider) as Count FROM @BookProvider 
GROUP BY BookName 
HAVING COUNT(DISTINCT BookProvider) > 1 

结果:

+-------------------+-------+ 
|  BookName  | Count | 
+-------------------+-------+ 
| Angels and Demons |  2 | 
+-------------------+-------+ 
0

这样的:

select count(bookname),bookname from tablename group by bookname having count(bookname)>1 
+0

对不起,我在第一个问题上犯了一个错误,我需要它基于独特的Book提供者。我更新了最初的帖子.. – MTplus

1

你想完整行,包括BOOKID和BookProviders?有一个子查询返回可以在多个商店中找到的书名。加入那个结果。

select t1.* 
from tablename t1 
join (select BookName from tablename 
     group by BookName 
     having count(distinct BookProvider) > 1) t2 
    on t1.BookName = t2.BookName 
0

如果要查看所有的书和他们的计数你甚至可以使用一个CTE与partion还有:

DECLARE @BookTable TABLE 
(
    BookId int, 
    BookName varchar(100), 
    BookProvider varchar(100) 
) 

INSERT INTO @BookTable 
(
    BookId, 
    BookName, 
    BookProvider 
) 
VALUES 
(1, 'Angel and Demons', 'Amazon'), 
(2, 'Angel and Demons', 'EBay'), 
(3, 'Tuesdays','Amazon'), 
(4, 'SQL 101', 'Amazon'); 

WITH BookCte 
AS 
(
    SELECT *, ROW_NUMBER() OVER (PARTITION BY TT.BookName ORDER BY TT.BookName) as RowNumber FROM @BookTable TT 
) 

SELECT * FROM BookCte BC