【问题标题】:finding duplicate values oracle SQL查找重复值oracle SQL
【发布时间】:2018-06-29 01:49:14
【问题描述】:

我正在尝试编写一个 oracle SQL 语句来告诉我对每个属性进行了多少调查。

我有一张桌子 - property:

还有一个在这里 - survey:

我使用下面的语句来完成此操作,但从结果表中可以看出,它仍然将重复项显示为单独的条目,因此计数函数只计数 1。

SELECT property.property_id, property.property_address_first_line, survey.survey_id, survey.date_of_viewing, count( property.property_id) as "number_of_surveys"        
    from property
    inner join survey
    on (survey.property_id = property.property_id)
    group by property.property_id, property.property_address_first_line, survey.survey_id, survey.date_of_viewing
    order by property.property_id;

非常感谢

【问题讨论】:

  • 不要发布示例数据的图像,在需要时可能很难重新创建场景。始终以纯文本形式发布。
  • 这是 Oracle DB 还是 Oracle MySQL?问题被标记为双向。
  • 正确标记!!!! MySQL Oracle SQL Server!!!这是哪一个???
  • 您需要survey_id 和date_of_viewing 吗?问题是“分组依据”只会计算完全相等的结果,并且由于每个调查都有一个唯一的 id,所以这是行不通的。我建议您从查询中删除此列并验证结果是否符合您的预期。
  • 非常感谢您的所有反馈,对于标签的任何混淆,我深表歉意。我是 stackoverflow 的新手,应该更好地构建标签并阅读要求。 Edumelzer,你是对的,我现在已经这样做了

标签: mysql sql-server oracle


【解决方案1】:

如果您想知道特定属性 ID 进行了多少次调查,您需要从查询中删除 survey.survey_id, survey.date_of_viewing 字段

SELECT property.property_id, property.property_address_first_line, count( survey.survey_id) as "number_of_surveys"        
    from property
    left outer join survey
    on (survey.property_id = property.property_id)
    group by property.property_id, property.property_address_first_line
    order by property.property_id;

【讨论】:

  • 假设平均有 100 处房产和 10 次调查,因此总共有 1,000 次调查。如果我们先加入,然后按分组和计数,则加入将是 100 x 1000 行。相反,如果我们先分组并计数(在调查表中,使用 property_id 进行分组),然后才连接到属性表,则连接将是 100 x 100 行。分组依据和计数适用于 1000 行。因此,首先计数(在子查询中),然后才连接两个表更有效。也许优化器会这样做,但最好从一开始就这样写。
  • 我还进行了编辑,将 inner join 更改为 left outer join - 可能存在尚未完成调查的属性。在大多数情况下,它们仍应显示,计数为 0。
  • @mathguy 不确定加入派生表会更有效.. 很可能性能相同,只是重新定位计算缩放器.. 另外,如果你想显示 0对于没有调查的属性,您必须合并子查询的结果,因为如果属性不存在,计数将为空
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-02-12
  • 1970-01-01
  • 1970-01-01
  • 2011-02-05
  • 2012-01-02
相关资源
最近更新 更多