确定列是否具有重复值sql

时间:2018-02-15 21:38:44

标签: sql-server

我试图找出一种方法来检查它们是否是共享行中的重复值。

示例:

HMOID     Name      Addon10        Addon15       Addon20
RFFF      Blah      img path1      img path2     img path1

对于我的例子,我想检查RFFF的任何插件是否有任何重复值。在上面的例子中,' RFFF'在Addon10和Addon20中有两个相同的图像(图像有一个路径。所以目前它们看起来像 http://oc2-reatest.regalmed.local/ocupgrade52/images/NDL_SCAN_SR.PNG)。

我希望能够为多行执行此操作。我认为以下内容会让我知道如何开始:

select * from HlthPlan
Group By HMO1A, HMONM
Having COUNT(*) > 1

然而,它通过以下错误:

  

Msg 8120,Level 16,State 1,Line 1
  专栏' HlthPlan.HMOID'在选择列表中无效,因为它不包含在聚合函数或GROUP BY子句中。*

我对SQL很新,任何建议都会受到赞赏。

3 个答案:

答案 0 :(得分:1)

不要为您的选择查询添加*。仅包括您在GROUP BY中使用的列

SELECT HMO1A, HMONM, COUNT(*) from HlthPlan
GROUP BY HMO1A, HMONM
HAVING COUNT(*) > 1;

答案 1 :(得分:0)

只需要检查三列,假设一行中有非空值:

select * from HlthPlan
where Addon10 in (Addon15, Addon20) or Addon15 = Addon20

您还可以使用cross apply来旋转分组值:

select HMOID, addon
from HlthPlan cross apply (
    select addon
    from (values (Addon01), (Addon02), (Addon03), ... (Addon20)) as pvt(addon)
) a
where addon is not null
group by HMOID, addon
having count(*) > 1;

http://rextester.com/QWIW87618

每个HMOID都会有多行,其中不同的列组具有相同的值。顺便说一下,报告所涉及的特定列的名称会给查询增加另一个难度。

答案 2 :(得分:0)

您可以通过UNPIVOT比较结果来检查这一点:

create table #hmo (hmoid varchar(6), name varchar(25), Addon10 varchar(25), 
                Addon15 varchar(25), addon20 varchar(25));

insert into #hmo
values ('RFFF', 'Blah','img path1', 'img path2', 'img path1');

select hmoid, name, addval, addcount = count(adds)
FROM #hmo
UNPIVOT
(
    addval FOR adds IN
    (addon10, addon15, addon20)
) as unpvt
group by hmoid, name, addval having count(*) > 1

会给出结果:

hmoid   name    addval  addcount 
RFFF    Blah    img path1   2

通过这种方式,您可以检查表中的每一行,并查看具有任意两列或多列具有相同值的行。

如果你有很多专栏,这确实有可能变得乏味;最简单的解决方法是使用sys.tablessys.columns中的信息动态构建查询。