栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 面试经验 > 面试问答

JOIN返回重复项后的GROUP或DISTINCT

面试问答 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

JOIN返回重复项后的GROUP或DISTINCT

虽然检索全部或大部分行从表中,对于这种类型的查询最快的方法通常是聚合/歧义 第一 和加入

SELECt *FROM   products pJOIN  (   SELECt DISTINCT ON (product_id) *   FROM   meta   ORDER  BY product_id, id DESC   ) m ON m.product_id = p.id;

meta
每行中的行越多
products
,对性能的影响越大。

当然,您需要

ORDER BY
在子查询中添加一个子句,以定义从子查询中的每个集合中选择 哪一
行。@Craig和@Clodoaldo已经告诉过您。我将返回
meta
最高的行
id

SQL提琴。

优化性能

尽管如此,这并不总是最快的解决方案。根据数据分布,还有其他各种查询样式。对于涉及另一个联接的这种简单情况,在带有大表的测试中,该联接的运行速度大大提高:

SELECt p.*, sub.meta_id, m.product_id, m.price, m.flagFROM  (   SELECt product_id, max(id) AS meta_id   FROM   meta   GROUP  BY 1   ) subJOIN meta     m ON m.id = sub.meta_idJOIN products p ON p.id = sub.product_id;

如果您不将非描述性

id
名称用作列名,那么我们就不会遇到命名冲突,只需编写即可
SELECT p.*, m.*
。(我 从来没有
使用
id
的列名。)

如果性能是您的首要要求,请考虑更多选择:

  • 如果您的数据没有变化(很多),则其中
    MATERIALIZED VIEW
    包含来自的预汇总数据
    meta
  • 递归CTE,模拟对每个产品有 很多 行的 表的 松散索引扫描 (相对而言,很少有不同的)。 这是我知道对整个表的DISTINCT查询使用索引的唯一方法。
    meta
    product_id


转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/635019.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号