首页 > 解决方案 > Knex.js for PostgreSQL 中具有不同 WHERE 子句的完全外连接

问题描述

我尝试获得一个包含两列显示聚合结果的单行:一列应显示基于一个 WHERE 子句的总和,而另一列应显示基于不同 WHERE 子句的总和。

期望的输出

amount_vic    amount_qld
100           70

在原始PostgreSQL中,我可以写这样的东西:

select 
 sum(a.amount) as amount_vic, 
 sum(b.amount) as amount_qld 
from mytable a 
full outer join mytable b on 1=1
where a.state='vic' and b.state= 'qld'

问题:如何在knex.js中编写返回所需结果的此查询或类似查询?例如:'on 1=1' 可能需要 knex.raw() 并且我认为表和列别名对我不起作用,它总是返回一些错误。

我在 knex.js 中的不工作尝试之一:

knex
        .sum({ amount_vic: 'a.amount' })
        .sum({ amount_qld: 'b.amount' })
        .from('mytable')
        .as('a')
        .raw('full outer join mytable on 1=1')
        .as('b')
        .where({
            a.state: 'vic',
            b.state: 'qld'
        })

谢谢您的帮助。

标签: postgresqljoinwhere-clauseknex.js

解决方案



免责声明:这不能回答问题的 Knex 部分 - 但评论太长了。


尽管您当前的查询可以满足您的要求,但它的措辞方式似乎并不理想。这里不需要生成自笛卡尔积 - 这就是这样full join ... on 1 = 1做的。您可以只使用条件聚合。

在 Postgres 中,您可以将其表述为:

select 
    sum(amount) filter(where state = 'vic') amount_vic,
    sum(amount) filter(where state = 'qld') amount_qld
from mytable
where state in ('vic', 'qld')

我不知道 Knex,所以我不知道如何将查询翻译成它。也许这个查询对您来说更容易翻译。


推荐阅读