复杂的SQL搜索重复项

时间:2014-01-07 06:01:05

标签: sql sql-server

我在SQL Server数据库中有一个表,如下所示:

+-----+-----+-----+-----+
| ID  |  A  |  B  |  C  |
+=====+=====+=====+=====+
|  1  |  1  |  1  |  6  |
|  2  |  1  |  2  |  7  |
|  3  |  1  |  3  |  3  |
|  4  |  2  |  1  |  6  |
|  5  |  2  |  2  |  7  |
|  6  |  2  |  3  |  8  |
|  7  |  3  |  1  |  6  |
|  8  |  3  |  2  |  9  |
|  9  |  3  |  3  | 10  |
| 10  |  4  |  4  |  4  |
+-----+-----+-----+-----+

在此表中,我需要提取A列值,其中有多个重复项具有不同的A值,但B和C值相等。这意味着在上表中ID 1与ID 4和ID 7匹配。进一步的ID 2与ID 5匹配,A 1和A 2将具有多个公共数据集,因此需要提取。但是A 3只与其他人有一个共同点,所以不应该提取。

我希望有人可以帮我解决这个问题,因为我没有找到任何简单的方法来做到这一点。

5 个答案:

答案 0 :(得分:0)

您是否在寻找以下查询?

和 如果我错过了什么,请告诉我。

declare @tab1 table (id int,a int,b int, c int)
insert into @tab1 values (1,1,1,6),(2,1,2,7),(3,1,3,3),(4,2,1,6),(5,2,2,7),(6,2,3,8),(7,3,1,6),(8,3,2,9),(9,3,3,10),(10,4,4,4)
 select * from @tab1

代码部分

 select 
 min(tem.id) id,min(tem.a) a,
 tem.b,tem.c
  from
 (
 select 
  x.* 
 from 
 @tab1 x
  where x.b in (select b from @tab1 y where y.a <> x.a)
  and x.c in (select c from @tab1 y where y.a <> x.a)
  ) tem
group by tem.b,tem.c

答案 1 :(得分:0)

你可以试试这个。但这是使用oracle,因为我不太了解SQL服务器。所以你can convert following Oracle SQl to SQL Server

SELECT A
FROM
  (SELECT DISTINCT a.*
  FROM temp2 a,
    temp2 b
  WHERE b.b = a.b
  AND b.c   = a.c
  AND b.a  != a.a
  )
GROUP BY A
HAVING COUNT(A)>1;

答案 2 :(得分:0)

查询的一般形式是:

SELECT data.id, data.a, data.b, data.c
FROM Temp data
JOIN (SELECT b, c
      FROM Temp
      GROUP BY b, c
      HAVING COUNT(*) > 1) count
  ON count.b = data.b
     AND count.c = data.c

Working SQL Fiddle

根据您需要的改进,还有其他几种变体;但是,由于你没有给出你想要的一组明确的结果(结果行,行删除或其他),这个解决方案将为您提供:

id  a  b  c
=============
1   1  1  6 
4   2  1  6 
7   3  1  6 
2   1  2  7 
5   2  2  7 

答案 3 :(得分:0)

根据要求,可以使用CTE获得结果。

这是查询。

 with cte(id,a,b,c,dupcount) as
 (
    select id,a,b,c,ROW_NUMBER() over(PARTITION by b,c order by a desc)  from tab
 )

 select id,a,b,c from cte where dupcount > 1 order by id

完成了。

答案 4 :(得分:0)

以下是适用于重复值fiddle here

的答案
SELECT
      [t].[id], [t].[a], [t].[b], [t].[c]
  FROM 
      [Temp] [t]
    JOIN (
      SELECT
            [b], [c]
        FROM (
          SELECT DISTINCT
                [a], [b], [c]
            FROM
                [Temp]) [deduplicated]
        GROUP BY
            [b], [c]
        HAVING
            count([a]) > 1) [r]
    ON [r].[b] = [t].[b] AND [r].[c] = [t].[c]