【问题标题】:Postgresql use more than one row as expression in sub queryPostgresql 在子查询中使用多行作为表达式
【发布时间】:2018-01-25 06:24:12
【问题描述】:

正如标题所说,我需要创建一个查询,其中我 SELECT 一个表中的所有项目并将这些项目用作另一个查询中的表达式。假设我的主表如下所示:

main_table
-------------------------------------
id | name | location | //more columns
---|------|----------|---------------
 1 | me   | pluto    | //
 2 | them | mercury  | //
 3 | we   | jupiter  | //

而子查询表是这样的:

some_table
---------------
id | item
---|-----------
 1 | sub-col-1
 2 | sub-col-2
 3 | sub-col-3

some_table 中的每件商品的价格都在 amount_table 中,如下所示:

amount_table
--------------
 1 | 1000
 2 | 2000
 3 | 3000

这样查询返回的结果是这样的:

name | location | sub-col-1 | sub-col-2 | sub-col-3 |
----------------------------------------------------|
me   | pluto    | 1000      |           |           |
them | mercury  |           | 2000      |           |
we   | jupiter  |           |           | 3000      |

我的查询目前看起来像这样

SELECT name, location, (SELECT item FROM some_table)
FROM main_table
INNER JOIN amount_table WHERE //match the id's

但我遇到了错误more than one row returned by a subquery used as an expression

如何制定此查询以返回所需的结果?

【问题讨论】:

  • 如果您希望 some_table 中的几行与 select 中的一个匹配(错误的原因),您应该加入它,而不是在子查询中使用,如果您想要一对一的关系 - 您可以将其用作你现在做,但是修改SELECT item FROM some_table你返回一行

标签: postgresql subquery pivot postgresql-9.1 crosstab


【解决方案1】:

你应该决定预期的结果。

获得一对多关系:

SELECT name, location, some_table.item
FROM main_table
JOIN some_table on true -- or id if they match
INNER JOIN amount_table --WHERE match the id's

与所有行一对一:

SELECT name, location, (SELECT array_agg(item) FROM some_table)
FROM main_table
INNER JOIN amount_table --WHERE //match the id's

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2013-05-24
    • 1970-01-01
    • 2019-02-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-07-23
    相关资源
    最近更新 更多