【问题标题】:How to lateral join a function如何横向加入函数
【发布时间】:2019-08-01 11:07:24
【问题描述】:

我不确定我的问题是否正确,但这就是我想要做的。

我有一个表errorlog 和字段link,我有一个函数http_get(基于pgsql-http,它给了我statusstatus

我认为我需要像这样进行横向连接:

SELECT
    el.link,
    hg.status
FROM
    errorlog AS el
    LEFT OUTER JOIN LATERAL http_get(el.link) AS hg ON true
WHERE el.link IS NOT NULL ;

但这并没有给我任何结果。如何将这样的函数应用于表格?

errorlog表:

+----+---------------------+
| id | link                |
+----+---------------------+
| 1  | http://www.test.com |
+----+---------------------+
| 2  | http://www.link.com |
+----+---------------------+

pgsql-http:https://github.com/pramsey/pgsql-http

更新: 我试过这些查询:

SELECT
    el.link,
    (http_get(el.link)).status
FROM
    errorlog AS el
WHERE el.link IS NOT NULL ;

结果:No records found.

SELECT
    el.link,
    hg.status
FROM
    errorlog AS el, http_get(el.link) AS hg
WHERE el.link IS NOT NULL ;

结果:No records found.

但是,这是可行的:

select * from http_get('http://test.com')

【问题讨论】:

  • 您确定http_get() 会返回任何内容吗?您是否使用硬编码的 URL 单独调用它?
  • @a_horse_with_no_name 是的,这有效select * from http_get('http://test.com')
  • @a_horse_with_no_name 我发现了问题,我的 link 字段由于某种原因被删除了,这可能是一个 dbeaver 问题,我正在删除一些记录但以某种方式删除了所有记录(或者可能是用户错误)。

标签: postgresql postgresql-10 lateral-join


【解决方案1】:

为什么不简单地调用SELECT 子句中的函数呢?

SELECT
    el.link,
    (http_get(el.link)).status
FROM
    errorlog AS el
WHERE el.link IS NOT NULL ;

另外,函数调用总是隐式执行,因为LATERALLEFT OUTER JOIN在这里基本没用,所以如果你坚持要横向执行函数,那么这样做:

SELECT
    el.link,
    hg.status
FROM
    errorlog AS el, http_get(el.link) AS hg
WHERE el.link IS NOT NULL ;

【讨论】:

  • 我已经尝试了第一个查询,但它给了我一个tax error at or near "." 错误,pgsql-http github 中没有显示您可以在 select 语句中使用该函数的示例。我也尝试了您提供的第二个查询,但没有成功,我应该说明这一点。
  • 好的,我想你已经解决了原来的问题(表中显然没有数据),对吧?所以我的回答只是展示了一些其他的语法变体,以不同的灵活性实现相同的目标。
【解决方案2】:

您的查询必须提供至少与errorlog 一样多的结果行。如果不是,那一定是有错误。

【讨论】:

  • 我已经更新了底部的原始帖子,其中包含我尝试过的内容以及有效和无效的内容。奇怪的是,他们提供的示例有效,但是当我将它与另一个表连接时,它失败了。
  • 您的第一个查询缺少括号:(http_get(el.link)).status。您的第二个查询不是外部联接。我没有看到与原始问题的联系。
猜你喜欢
  • 2018-05-20
  • 1970-01-01
  • 1970-01-01
  • 2017-03-25
  • 2014-08-19
  • 2014-02-27
  • 1970-01-01
  • 2012-07-31
  • 1970-01-01
相关资源
最近更新 更多