【问题标题】:non-repeating column in postgresqlpostgresql中的非重复列
【发布时间】:2020-06-01 11:56:33
【问题描述】:

我的查询是这样的:

SELECT o.id, o.title, oc.category_id,
(SELECT name from categories c where c.id = oc.category_id)
FROM objects o
LEFT JOIN object_categories oc ON oc.object_id = o.id
WHERE type_id = 17

它像图片一样返回我的桌子

我想返回不重复的类别名称。谁能帮帮我?

【问题讨论】:

  • 那么您实际期望的结果是什么?
  • @GMB 如您在name 列中看到的那样重复两次。我希望如果任何名称超过 1,它只返回一次
  • (SELECT DISTINCT name from categories c where c.id = oc.category_id) 可能是您正在寻找的东西。 w3schools.com/sql/trysql.asp?filename=trysql_select_distinct

标签: sql postgresql greatest-n-per-group postgresql-9.6


【解决方案1】:

在 Postgres 中,你可以使用distinct on:

SELECT DISTINCT ON(c.id)
    o.id, 
    o.title, 
    oc.category_id,
    c.name,
    count(*) over(partition by o.id) cnt
FROM objects o
LEFT JOIN object_categories oc ON oc.object_id = o.id
LEFT JOIN categories c ON c.c.id = oc.category_id
WHERE type_id = 17 
ORDER BY c.id, o.id

当一个类别出现在多个记录中时,这只会选择具有最小对象 id 的那个。

我使用类别 ID 而不是名称来识别重复项 - 如果这对您很重要,您可以改用类别名称。

请注意,我将 categories 上的内联子查询转换为常规的 join,因为我发现它更具可读性。

【讨论】:

    【解决方案2】:

    为此,您可以使用 DISTINCT ON 表达式: https://www.postgresql.org/docs/9.0/sql-select.html#SQL-DISTINCT

    【讨论】:

      猜你喜欢
      • 2021-01-05
      • 2013-12-18
      • 2020-08-21
      • 2013-07-03
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多