我不确定我在这里需要什么,或者是否可以在SQL中使用,但是,这里有...
我需要一个查找列的唯一重复项的查询(矛盾,我知道)。 Ex(逗号分隔DB记录):
- Column A = 1,2,3,4
- Column B = X,Z,Y,X
我想看看1,X和4,X的值是什么,因为列B是为那些记录重复的。
我希望这是有道理的,如果我需要澄清任何事情,请告诉我。
感谢您的帮助。
编辑:
我的数据
custid RefNbr
CWPBA001 144632
BANOF001 144632
TYROK001 155232
BANOF002 155232
BANOF001 155002
TYROK001 155003
查询将返回..
custid RefNbr
CWPBA001 144632
BANOF001 144632
TYROK001 155232
BANOF002 155232
因为不同的custid使用了两次相同的refnbr。
答案 0 :(得分:0)
我认为这是你正在寻找的东西:
select ColumnA
, ColumnB
from TABLE t
where exists (select 1
from TABLE
group by ColumnB
having count(ColumnB) > 1
and t.ColumnB = ColumnB)
group by ColumnA, ColumnB
having count(*) = 1
查询将查找出现次数超过1的值并返回这些行。
此外,如果这些选定的(ColumnA, ColumnB)
组合不是唯一的,那么它们将被删除,并且只会返回整个结果集中(ColumnA, ColumnB)
的唯一组合。
在这种情况下,系统会返回(1, 'x')
和(4, 'x')
,因为它们是唯一的。
declare @tbl table (a int, b char(1));
insert @tbl values (1, 'x')
, (2, 'z')
, (3, 'y')
, (4, 'x')
select a
, b
from @tbl t
where exists (select 1 from @tbl group by b having count(b) > 1 and t.b = b)
group by a, b
having count(*) = 1
但在以下方案中,只会返回(4, 'x')
,因为组合(1, 'x')
是重复的。
declare @tbl2 table (a int, b char(1));
insert @tbl2 values (1, 'x') -- duplicate
, (1, 'x') -- duplicate
, (2, 'z')
, (3, 'y')
, (4, 'x')
select a
, b
from @tbl2 t
where exists (select 1 from @tbl2 group by b having count(b) > 1 and t.b = b)
group by a, b
having count(*) = 1
如果您仍然希望在此方案中返回(1, 'x')
的组合,那么您所要做的就是删除查询的最后两行。
group by a, b -- to be removed
having count(*) = 1 -- to be removed
答案 1 :(得分:0)
假设您没有标识栏:
create table #t (ColumnA int, ColumnB char(1))
insert into #t values (1,'X')
insert into #t values (2,'Z')
insert into #t values (3,'Y')
insert into #t values (4,'X')
select ColumnA, ColumnB
FROM #t
where ColumnB in (
select ColumnB
From #t
group by ColumnB
Having count(*)>1)
答案 2 :(得分:0)
另一种选择是使用窗口函数
Select CustID,RefNbr
From (
Select *
,Hits = sum(1) over (Partition By RefNbr)
From YourTable
) A
Where Hits>1