在不创建新表的情况下排除重复项的更好方法

时间:2019-04-20 15:31:23

标签: mysql sql subquery

我有一个查询,该查询使用子查询来检测联接表中的项目是否具有重复记录,如果是,则数据不会被拉入父查询:

func imagePickerController(_ picker: UIImagePickerController, didFinishPickingMediaWithInfo info: [UIImagePickerController.InfoKey : Any]) {
    let image = info[UIImagePickerController.InfoKey.originalImage] as! UIImage
    imageCam.image = image

    //  var discover = MainViewController()

    //  discover.stuffImages[IndexPath.row]

    picker.dismiss(animated: true, completion: nil)
}

func imagePickerControllerDidCancel(_ picker: UIImagePickerController) {
    picker.dismiss(animated: true, completion: nil)
}

如您所见,通过使用HAVING子句使用一种简单的方式处理重复项,实际上我丢失了存储的原始记录,因为抛出了任何大于2的聚合记录。有没有更好的方法可以做到这一点,以使我不会丢失一些数据,而无需创建要查询的新表?

2 个答案:

答案 0 :(得分:0)

如果subqerry中“具有”,请尝试使用“ distinct”代替。每个网址只有一次,不会丢失,即使有两个条目也是如此。

因此您的代码应为:

...选择DISTINCT a.listing_datetime,...

,然后最后没有“ having”。

答案 1 :(得分:0)

如果要删除重复的行,请使用DISTINCT子句。如果要基于特定列上的分区查找重复项,请使用ROW_NUMBER窗口函数。

乍一看,您的子查询无效,因为您是按一个列分组,而在其他列中未使用任何其他聚合函数。

select distinct
  a.listing_datetime, a.listing_price, a.listing_sqft, a.listing_p_per_sqft,
  a.listing_neighborhood, i.listing_tokens
from
  agg_cl_data as a
  left join incoming_cl_data_desc as i
    on a.listing_url = i.listing_url
where a.listing_datetime between curdate() - interval 30 day and curdate()