【问题标题】:Selecting ONLY Duplicates from a joined tables query从联接表查询中仅选择重复项
【发布时间】:2016-07-21 14:09:14
【问题描述】:

我有以下查询,我正在尝试连接两个与其 ID 匹配的表,以便我可以在“c.code”中获取重复值。我尝试了很多查询,但没有任何效果。我的数据库中有 500k 行,通过这个查询我只得到 5k 回来,这是不对的。我肯定它至少是200K。我也尝试使用 Excel,但它处理不了太多。 有任何想法吗? 提前谢谢大家。

SELECT c.code, c.name as SCT_Name, t.name as SYNONYM_Name, count(c.code)
FROM database.Terms as t
  join database.dbo.Concepts as c on c.ConceptId = t.ConceptId
  where t.TermTypeCode = 'SYNONYM' and t.ConceptTypeCode = 'NAME_Code' and c.retired = '0'
   Group by c.code, c.name, t.name
   HAVING COUNT(c.code) > = 1

Order by c.code

【问题讨论】:

  • code 是可以为空的列吗?您从该查询中获得了哪些计数值。请记住,group by 会将原始行折叠成单行,因此如果有很多重复,5k 可能是正确的。

标签: sql sql-server group-by duplicates large-data


【解决方案1】:

如果您只想要 c.code 的副本,那么您的 Group By 是错误的(您的 Have 子句也是如此)。试试这个:

SELECT c.code
FROM database.Terms as t
  join database.dbo.Concepts as c on c.ConceptId = t.ConceptId
  where t.TermTypeCode = 'SYNONYM' and t.ConceptTypeCode = 'NAME_Code' and c.retired = '0'
   Group by c.code
   HAVING COUNT(c.code) > 1

这将返回您拥有多个 c.code 值的所有行。

【讨论】:

  • 感谢兰迪的回复,但我得到了 0 的回报。
  • @Beavis855 - 那么根据您的 Where 子句,您没有任何重复项。
  • 我们确实有重复。 c.code 是在该列中重复的数值,但在其他两列中具有不同的字母值。是否有意义?即 c.code 1 文本一个
  • 我认为您的 Where 子句正在过滤所有重复项。尝试删除它。
  • 不是。那部分是正确的。我有这 3 列,其中包含不同的数据,所以我正在过滤我真正想要阅读的那些,并且我在 c.code 中有重复项,在 c.name 和 t.name 中有不同的值。
【解决方案2】:

您需要使用 INTERSECT 而不是 JOIN。基本上,您在第一个表上执行选择,然后与第二个表相交。结果是重复的行。

不过,只选择 id 列,否则 intersect 将无法按预期工作。

【讨论】:

  • 谢谢菲利普,但它没有用。 “相交”使我的第二张表无效。
  • c.retired 真的是一个 char 列吗?因为 c.retired = '0' 看起来很奇怪。轮流无效是什么意思?
  • “分组依据”之前的所有内容都是正确的。我们有 Retired 部分来识别哪些代码有效(0),哪些代码不再有效(1)。我从这里的论坛中得到了部分组和拥有。但是,当我在查询中加入时它不起作用。一旦我用 Intersect 重新编写它,我的 c 概念就会变成“红色”。有意义吗?
  • 但是退役的列是 char 还是 int 列?我认为 2-3 行样本数据会有所帮助。
  • c.code c.name t.name 10001005细菌细菌1 10001005细菌细菌3 10001005细菌细菌4 10001005细菌细菌5 10002003猫科动物0 10002003猫猫素哺乳素2猫西门2是我得到的当我按部分运行我的常规查询时。我有兴趣重复检查 c.name 和 t.name 中的值是否正确,然后我需要进行编辑。
【解决方案3】:
with data as (
    select c.code, c.name as SCT_Name, t.name as SYNONYM_Name
    from database.Terms as t inner join database.dbo.Concepts as c
        on c.ConceptId = t.ConceptId
    where
            t.TermTypeCode = 'SYNONYM'
        and t.ConceptTypeCode = 'NAME_Code'
        and c.retired = '0'
)
select *
    --, (select count(*) from data as d2 where d2.code = data.code) as code_count
    --, count(*) over (partition by code) as code_count
from data
where code in (select code from data group by code having count(*) > 1)
order by code

【讨论】:

  • 非常感谢 Shawnt00。这正是我所需要的!谢谢!感谢所有帮助过我的人。
猜你喜欢
  • 2017-07-01
  • 2018-07-30
  • 1970-01-01
  • 2018-09-30
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-07-11
相关资源
最近更新 更多