我在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只与其他人有一个共同点,所以不应该提取。
我希望有人可以帮我解决这个问题,因为我没有找到任何简单的方法来做到这一点。
答案 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
根据您需要的改进,还有其他几种变体;但是,由于你没有给出你想要的一组明确的结果(结果行,行删除或其他),这个解决方案将为您提供:
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]