我有以下表格
col_1 col_2 col_3 col_4
1 2 3 1
4 6 1 2
7 5 8 3
0 7 9 4
例如,在上表中,第一行(第一列)中的值“1”在第二行(第三列)中重复。所以我的结果中不需要第二行。同样地,我想在现有表中识别重复的行,并且我必须仅显示下面的预期结果中的行。如何使用t-sql实现这一目标?
注意:Col_4是唯一标识每一行的列。此列不应包含在重复评估中,但应用于删除重复行,如下所示(col_4的升序)。
我的预期结果:
col_1 col_2 col_3
1 2 3
7 5 8
答案 0 :(得分:0)
select col1, col2, col3
from table t1
where not exists ( select 1
from table t2
where t1.col4 < t2.col4
and ( t2.col1 = t1.col1
or t2.col2 = t1.col1
or t2.col3 = t1.col1
)
)
答案 1 :(得分:0)
尝试下面的解决方案。复制并粘贴到sql studio。
create table cols
(
col1 smallint,
col2 smallint,
col3 smallint,
col4 INT IDENTITY(1,1) NOT NULL
);
insert into cols
values(1,2,3),(4,6,1),(7,5,8),(0,7,9),(11,12,13),(17,15,16),(10,17,20),(11,2,3)
select * from cols
select * from cols where col4 in (
select t2.col4 from cols t1
inner join (
select col1,col2,col3,col4 from cols
) t2 on
(t1.col1 = t2.col1 or t1.col1 = t2.col2 or t1.col1 = t2.col3 or
t1.col2 = t2.col1 or t1.col2 = t2.col2 or t1.col2 = t2.col3 or
t1.col3 = t2.col1 or t1.col3 = t2.col2 or t1.col3 = t2.col3 )
and t1.col4 > t2.col4
)
drop table cols
答案 2 :(得分:-1)
在同一张桌子上进行内部联接,对所有感兴趣的列进行比较并检查唯一ID,以确保您不会最终加入自己的记录
select mytable a
inner join mytable b on (a.col1 = b.col1 or a.col1 = b.col2 or a.col1 = bcol3 or a.col2 = b.col1 or ...etc...) and a.id != b.id
那应该会给你一份重复的清单。我还没有对它进行过测试,但我相信这应该可行。
修改 - 我已对上述内容进行了测试,我可以确认其有效