【问题标题】:Postgres where clause over two columns from subqueryPostgres where 子查询中两列的子句
【发布时间】:2018-03-06 12:44:21
【问题描述】:
  • 数据库:Postgres
  • 表名:records
  • 有 4 列 Year | Dept | Expense | Month

因此,每年每个月/每个部门最多可以有一个记录。

我有一个子查询,它根据约束返回以下数据。

Year | Dept
2001 | HR
2001 | ACC
2001 | TECH
2002 | TECH
2003 | HOUSE-KEEPING
2003 | TECH

现在我需要在同一张表上运行另一个查询来获取每个值对的总费用。

使用子查询的输出,我的主查询将类似于

select Dept, sum(Expense) 
from records 
where (Year, Dept) in (...)
... I want to iterate over value pairs from the subquery

(SUBQUERY which returns
Year | Dept
2001 | HR
2001 | ACC
2002 | TECH
2003 | HOUSE-KEEPING
)

当我运行此 select 语句时,返回的输出仅包含 TECH 在所有三年中的数据。

请帮助理解我如何在子查询的所有行上运行主选择

【问题讨论】:

    标签: sql postgresql select subquery where-clause


    【解决方案1】:

    将子查询重构为连接。

    说你有

    SELECT a, b FROM t1 WHERE (x,y) IN (SELECT x1, y1 FROM t2 WHERE ...)
    

    这是行不通的。你改写成

    SELECT a, b
    FROM t1
    INNER JOIN (
       -- subquery here:
       SELECT x1, y1
       FROM t2
       WHERE ...
    ) AS some_alias
    WHERE t1.x = some_alias.x1
      AND t1.y = some_alias.y1;
    

    注意,in PostgreSQL you shouldn't use a CTE (WITH query) for this

    你可以缩写

    WHERE t1.x = some_alias.x1
      AND t1.y = some_alias.y1;
    

    WHERE (x, y) = (x1, y1)
    

    虽然。

    【讨论】:

    • 非常感谢克雷格的回复。这会让我开始。我应该在最初的问题中提供更多细节。我的子查询是使用 with 查询形成的。我已经简化了实际的数据库,希望能简化回答部分。你的回答让我意识到这不是一个好主意。我将发布一个包含所有细节的新问题。再次感谢您的帮助。
    • 嗨,克雷格 - 我已经在这里重新发布了包含所有细节的问题 - stackoverflow.com/questions/46425141/…
    • inner join 不需要on 吗?
    • @Growler 是的。我认为应该是ON 而不是WHERE。不记得了,没时间再查了。
    • @Craig 并不是故意吹毛求疵——我想这也许是我不知道的一些隐藏的 postgres 诡计
    【解决方案2】:

    如果您没有数百万行,则可以通过将值连接成一个值来保持查询的语义:

    select Dept, sum(Expense)
    from records
    where Year || Dept in (select Year || Dept from ...)
    

    它易于阅读、理解和维护,除非你有数以亿计的年数和部门,否则它的性能会很好,这似乎不太可能。

    【讨论】:

      【解决方案3】:

      解决方案found here

      SELECT dept, SUM(expense) FROM records 
      WHERE ROW(year, dept) IN (SELECT x, y FROM otherTable)
      GROUP BY dept;
      

      ROW 函数具有魔力。

      【讨论】:

      • @Thirumal 您使用的是哪个版本的 Postgresql?我使用 9.6 和 10.7,它工作正常。这个确切的示例可能不起作用,因为它缺少 group by 并且可能与您自己的表结构相对应的详细信息,但原理就在那里。
      猜你喜欢
      • 2018-03-07
      • 2012-10-16
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-09-12
      • 2014-04-04
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多