【问题标题】:PostgreSQL Integer in Array is not merge-joinable数组中的 PostgreSQL 整数不可合并连接
【发布时间】:2021-01-17 23:40:48
【问题描述】:

我想在整数数组中的整数条件上执行 FULL OUTER JOIN。

查询看起来像这样:

SELECT thing FROM table1 t1
FULL OUTER JOIN table2 t2
ON t1.id = ANY(t2.array_of_ids)

但我收到以下错误:

FULL JOIN 仅支持可合并或可散列连接的连接条件

有没有办法让这个条件可以合并连接?

【问题讨论】:

  • 我给出的这段代码适用于 INNER JOIN。我基本上想将它与外部连接一起使用。换句话说,我希望 table1 和 table 2 中的每个元素都在选择中。如果 table1 中的元素在 table2 的 array_of_ids 列中有一个 ID,我希望它们是同一行(之后我使用聚合函数)
  • 请通过编辑而不是 cmets 进行澄清。我同意说它像您所做的那样与内部连接一起使用会有所帮助。 PS 一个“基本上”或“基本上”或“换句话说”,它没有介绍或总结您也给出的清晰、准确和完整的描述,只是意味着“不清楚”。 PS我希望这是一个常见问题解答,您是否在网站上搜索过:stackoverflow.com? this 有帮助吗? (请参阅有关 ANY 的文档。)也许数组包含运算符?或者将数组转换为表格。
  • 我看到两个选项:1)规范化你的数据模型,所以你不需要使用数组来加入。 2)使用两个查询:一个左连接,一个右连接并将它们与联合结合

标签: sql arrays postgresql outer-join


【解决方案1】:

嗯。 . .它是这样工作的吗?

SELECT thing
FROM table1 t1 FULL OUTER JOIN
     (table2 t2 CROSS JOIN
      UNNEST(t2.array_of_ids) t2_id
     )
     ON t1.id = t2_id;

这样做的问题是它会使行数成倍增加。那么,只构建FULL JOIN 怎么样?

SELECT . . .
FROM table1 t1 LEFT JOIN
     (table2 t2 CROSS JOIN
      UNNEST(t2.array_of_ids) t2_id
     )
     ON t1.id = t2_id
UNION ALL
SELECT . . .
FROM table2 t2
WHERE NOT EXISTS (SELECT 1
                  FROM UNNEST(t2.array_of_ids) t2_id JOIN
                       table1 t1
                  ON t2_id = t1.id
                 );

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-04-02
    • 2020-02-04
    • 1970-01-01
    • 2015-08-29
    • 2021-08-31
    相关资源
    最近更新 更多