【问题标题】:Inner Join with similar IDs具有相似 ID 的内部联接
【发布时间】:2020-02-19 05:34:31
【问题描述】:

我有两张桌子,比如说:

Table 1

id, name, place
1, a, b
2, c, d
3, e, f

Table 2

id,text
1, hello
1, bye
1, what
2, tired

期望的输出

id, name, place, text
1, a, b, hello or bye or what (any one of the three)
2, c, d, tired

我看过很多帖子,但我找不到类似的东西。我是 SQL/Postgresql 的新手。我在 PostgreSQL 里做。

【问题讨论】:

  • 所以你想要一个数组还是什么?
  • @andronicus 我只想要任何 1 值,因为它是我无法使用 min() 或 max() 的文本
  • 这不清楚。请通过编辑而不是 cmets 进行澄清。用足够的词。在代码问题中,请提供minimal reproducible exampleHow to Ask

标签: sql postgresql group-by aggregate inner-join


【解决方案1】:

您可以在此处使用DISTINCT ON 并任意取第二个表格中字母顺序最低的文本:

SELECT DISTINCT ON (t1.id) t1.id, t1.name, t1.place, t2.text
FROM Table1 t1
INNER JOIN Table2 t2
    ON t1.id = t2.id
ORDER BY
    t1.id,
    t2.text;

Demo

【讨论】:

  • 这很好用,非常感谢。我也在弄清楚如何接受答案,而且我的声誉还不够高,无法对投票产生影响,抱歉。
  • @AkifBeig 。 . .我只想指出DISTINCT ON 是一个(非常方便的)Postgres 对 SQL 的扩展。
【解决方案2】:

您可以在一个数组中聚合多个值并选择一个随机值(postgres 语法):

select t1.id, (array_agg(t2.text))[floor(random() * count(t2.text) + 1)::int]
from table1 t1
inner join table2 t2 on t1.id = t2.id
group by t1.id

或者快一点,但只会选择第一个值:

select t1.id, (array_agg(t2.text))[1]
from table1 t1
inner join table2 t2 on t1.id = t2.id
group by t1.id

【讨论】:

  • OP 需要所有可能的值,而不是所有的聚合值。引用:三个中的任何一个。使用 MAX()、MIN() 或除 STRING_AGG() 之外的类似方法。
  • @Akina 好的,我不明白这一点,因此评论中的问题。已更正,谢谢。
  • @TimBiegeleisen 我正在为给定 id 创建一个包含所有值的数组,并随机选择一个(或第二个狙击手中的第一个)
  • 不错的一个+1 ...不会想到这样做。
  • @Andronicus 这给了我错误 t1.name 必须出现在 group by 子句中,t1.place 必须出现在 group by 子句中。我复制粘贴了确切的解决方案
【解决方案3】:

你会写一些类似

的东西

table 1 中选择 t1.id、名称、地点、文本作为 t1
在 t2.id = t1.id 上加入 table 2 作为 t2 按 t1.id 分组

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-01-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多