sql - postgres 中的子查询或连接联合?

标签 sql postgresql subquery inner-join outer-join

我有所谓的链接,可以为它们分配标签,所以我将它存储在 3 个表中:

  • 标签:id,姓名
  • tag_in_link: tag_id, link_id
  • 链接:id,url

现在我需要获得基本的标签计数:标签被使用了多少次(包括 0 次)。我有两个问题:

select t.id, t.name, count(*)
from tag as t inner join tag_in_link as tl
    on tl.tag_id = t.id
group by t.id, t.name
union
select t.id, t.name, 0
from tag as t left outer join tag_in_link as tl
    on tl.tag_id = t.id where tl.tag_id is null

union of joins explained

select t.id, t.name,
       (select count(*) from tag_in_link as tl
              where tl.tag_id = t.id
       ) as count from tag as t

correlated subquery

它们都给出相同的(达到记录的顺序)结果并且工作速度几乎一样快

问题是我没有太多数据来测试它,但我今天需要选择一种或另一种方式。我所知道的是,将会有:

  • 最多 100 个标签
  • 数百万个链接

所以我的问题是:

  • 哪种方法:依赖子查询或联合联合在 postgres 中的大型表上具有更好的性能?

最佳答案

第一个查询对于大型数据集会更好,因为它不会强制嵌套循环。

但为什么不使用最优查询:

SELECT t.id, t.name, count(*)
FROM tag AS t LEFT JOIN tag_in_link AS tl
    ON tl.tag_id = t.id
GROUP BY t.id, t.name;

关于sql - postgres 中的子查询或连接联合?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48136891/

相关文章:

sql - 可以在 SQL SELECT 语句中使用表作为列吗?

MySQL 查询匹配不相关的术语

SQL - 获取包含特定列中数据的最新行,或者如果该列中没有数据则仅获取最新行

postgresql - 使用 Helm 的 PostgreSQL 中的意外持久存储

mysqli连接查询很慢

node.js - 如何在 node.js 中的异步和条件循环中执行嵌套查询

postgresql - to_timestamp 存储时区数据

java - 使用查询语言与 Java 来确定信息

php - MySQLi 排名脚本

mysql - 显示分组依据的所有行