SQL查询在搜索中使用2列

时间:2017-01-30 15:37:18

标签: sql sql-server database

我不确定我在这里需要什么,或者是否可以在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。

3 个答案:

答案 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