如何从 PostgreSQL 子查询返回两个值?

彼得让

我有一个问题,我需要在 PostgreSQL 的各个表中获取最后一项。

以下代码有效并向我返回最新更新的类型以及上次更新的时间。

问题是,这个查询需要用作子查询,所以我想从这个查询中选择类型和最后更新的值,而PostgreSQL似乎不喜欢这个......(Subquery must return only one column

有什么建议么?

SELECT last.type, last.max FROM (
    SELECT MAX(a.updated_at), 'a' AS type FROM table_a a WHERE a.ref = 5 UNION
    SELECT MAX(b.updated_at), 'b' AS type FROM table_b b WHERE b.ref = 5
) AS last ORDER BY max LIMIT 1

Query 在 CTE 中是这样使用的;

WITH sql_query as (
    SELECT id, name, address, (...other columns),

    last.type, last.max FROM (
      SELECT MAX(a.updated_at), 'a' AS type FROM table_a a WHERE a.ref = 5 UNION
      SELECT MAX(b.updated_at), 'b' AS type FROM table_b b WHERE b.ref = 5
    ) AS last ORDER BY max LIMIT 1

    FROM table_c
    WHERE table_c.fk_id = 1      
  )
保罗麦克斯韦

固有的问题是 SQL(所有 SQL 不仅仅是 Postgres)要求在 select 子句中使用的子查询只能返回一个值。如果你考虑一下这个限制,它确实是有道理的。select 子句返回行和一定数量的列,每个 row.column 位置是网格中的一个位置。您可以通过将连接放入单个位置(或单个“复杂类型”,如 JSON 值)来稍微改变该规则,但无论如何它仍然是该网格中的单个位置。

但是,在这里您确实需要 2 个单独的列,并且您需要从同一行返回两列,因此LIMIT 1我建议使用ROW_NUMBER()代替来促进这一点:

WITH LastVals as (
      SELECT type
           , max_date
           , row_number() over(order by max_date DESC) as rn
      FROM (
            SELECT MAX(a.updated_at) AS max_date, 'a' AS type FROM table_a a WHERE a.ref = 5
            UNION ALL
            SELECT MAX(b.updated_at) AS max_date, 'b' AS type FROM table_b b WHERE b.ref = 5
            )
     )
, sql_query as (
     SELECT id
          , name, address, (...other columns)

          , (select type from lastVals where rn = 1) as last_type
          , (select max_date from lastVals where rn = 1) as last_date 

     FROM table_c
     WHERE table_c.fk_id = 1      
    )

----

顺便说一下,在您的子查询中,您应该使用UNION ALLtype 作为常量,例如 'a' 或 'b' 那么即使MAX(a.updated_at)对于 2 个或更多表是相同的,由于类型不同,行仍然是唯一的。UNION将尝试删除重复的行,但在这里它不会有帮助,所以通过使用UNION ALL.

----

另一种方式对皮肤这只猫,可以考虑使用LEFT JOIN替代

  SELECT id
      , name, address, (...other columns)

      , lastVals.type
      , LastVals.last_date 

  FROM table_c
  WHERE table_c.fk_id = 1      
  LEFT JOIN (
        SELECT type
             , last_date
             , row_number() over(order by last_date DESC) as rn
        FROM (
              SELECT MAX(a.updated_at) AS last_date, 'a' AS type FROM table_a a WHERE a.ref = 5
              UNION ALL
              SELECT MAX(b.updated_at) AS last_date, 'b' AS type FROM table_b b WHERE b.ref = 5
              )
        ) LastVals ON LastVals.rn = 1

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

如何在两个hstore postgresql中连接值?

来自分类Dev

如何从AJAX查询返回两个值到javascript?

来自分类Dev

如何使用联接查询返回两个表值

来自分类Dev

如何子查询两个联接?

来自分类Dev

如何将一个PostgreSQL查询的返回值传递给另一个PostgreSQL查询?

来自分类Dev

如何将一个PostgreSQL查询的返回值传递给另一个PostgreSQL查询?

来自分类Dev

在PostgreSQL查询的两个地方使用计算值

来自分类Dev

如何使用$ geoNear沿结果返回距离以得到两个不同的子值

来自分类Dev

如何在Postgresql中比较两个表?

来自分类Dev

PostgreSQL:如何连接两个regexp_matches()

来自分类Dev

如何在 PostgreSQL 函数中组合两个选择?

来自分类Dev

如何将记录值传递给子查询(PostgreSQL)?

来自分类Dev

结合两个 Postgresql 查询

来自分类Dev

PostgreSQL如何执行查询?

来自分类Dev

如何改善Postgresql查询?

来自分类Dev

如何从 VBA 查询 PostgreSQL

来自分类Dev

基于子查询的两个条件。如何缩短呢?

来自分类Dev

如何进行查询以返回包含Servicestack.Ormlite中两个联接表中的值的字典的查询?

来自分类Dev

如何在Postgresql中将两个选择查询水平组合在同一张表上?

来自分类Dev

PostgreSQL:如何使用两个日期之间的时间联接两个表?

来自分类Dev

PostgreSQL在两个值之间联接

来自分类Dev

如何比较两个SQL查询值

来自分类Dev

这个postgresql查询如何返回为表?

来自分类Dev

PostgreSQL 函数遍历查询,如何返回表

来自分类Dev

如何从C ++中的函数返回两个值?

来自分类Dev

如何从两个异步方法返回值?

来自分类Dev

如何使函数支持一两个返回值

来自分类Dev

Python:如何从从Elif调用的函数返回两个值?

来自分类Dev

如何从两个异步方法返回值?

Related 相关文章

  1. 1

    如何在两个hstore postgresql中连接值?

  2. 2

    如何从AJAX查询返回两个值到javascript?

  3. 3

    如何使用联接查询返回两个表值

  4. 4

    如何子查询两个联接?

  5. 5

    如何将一个PostgreSQL查询的返回值传递给另一个PostgreSQL查询?

  6. 6

    如何将一个PostgreSQL查询的返回值传递给另一个PostgreSQL查询?

  7. 7

    在PostgreSQL查询的两个地方使用计算值

  8. 8

    如何使用$ geoNear沿结果返回距离以得到两个不同的子值

  9. 9

    如何在Postgresql中比较两个表?

  10. 10

    PostgreSQL:如何连接两个regexp_matches()

  11. 11

    如何在 PostgreSQL 函数中组合两个选择?

  12. 12

    如何将记录值传递给子查询(PostgreSQL)?

  13. 13

    结合两个 Postgresql 查询

  14. 14

    PostgreSQL如何执行查询?

  15. 15

    如何改善Postgresql查询?

  16. 16

    如何从 VBA 查询 PostgreSQL

  17. 17

    基于子查询的两个条件。如何缩短呢?

  18. 18

    如何进行查询以返回包含Servicestack.Ormlite中两个联接表中的值的字典的查询?

  19. 19

    如何在Postgresql中将两个选择查询水平组合在同一张表上?

  20. 20

    PostgreSQL:如何使用两个日期之间的时间联接两个表?

  21. 21

    PostgreSQL在两个值之间联接

  22. 22

    如何比较两个SQL查询值

  23. 23

    这个postgresql查询如何返回为表?

  24. 24

    PostgreSQL 函数遍历查询,如何返回表

  25. 25

    如何从C ++中的函数返回两个值?

  26. 26

    如何从两个异步方法返回值?

  27. 27

    如何使函数支持一两个返回值

  28. 28

    Python:如何从从Elif调用的函数返回两个值?

  29. 29

    如何从两个异步方法返回值?

热门标签

归档