【问题标题】:Simple Postgres query returning no result简单的 Postgres 查询不返回任何结果
【发布时间】:2020-07-09 15:52:22
【问题描述】:

我有两张桌子:

products(id: integer, price: float, website_id: integer) 

adjustments(id: integer, product_id: integer, website_id: integer, factor:float)

我在两个表中都有关于 id 的索引,并且在调整表中的 website_id 和 product_id 上都有索引。

这个查询返回数据,但它需要大约 5 秒,大约 1k 产品和几百个调整:

select 
    products.id, 
    case
    when adjustments.website_id = 1
    then
        products.price+coalesce(adjstments.factor,0)
    else
        products.price
    end as price
from
    products
left join
    adjustments on products.id = adjustments.product_id
where
    products.website_id = 1;

但是,当调整表中没有任何内容时,此其他查询不会返回任何结果:

select 
    products.id, 
    products.price+coalesce(adjstments.factor,0) as price
from
    products
left join
    adjustments on products.id = adjustments.product_id
where
    products.website_id = 1 and adjustments.website_id = 1;

是否不应该从第一个表中返回数据,无论第二个表中是否有任何匹配记录?我做错了什么?

【问题讨论】:

    标签: sql postgresql select left-join


    【解决方案1】:

    where 子句中的过滤(如果在连接后应用)。所以在这里,您从products 获取所有行,并将它们与空的adjustments 行匹配(因为表是空的)。然后,应用 where 条件,其中包括 adjustments.website_id = 1,因为 adjustment.website_id 始终为 null,不会返回任何行。

    您可以将此条件移动到join 以获得您期望的行为:

    select 
        products.id, 
        products.price+coalesce(adjstments.factor,0) as price
    from
        products
    left join
        adjustments on products.id = adjustments.product_id and adjustments.website_id = 1
    where
        products.website_id = 1;
    

    【讨论】:

    • 很好,开始工作了,非常感谢。两者似乎都需要太长时间,比如 5 秒,猜想尝试使用替代方案。
    猜你喜欢
    • 1970-01-01
    • 2011-04-17
    • 1970-01-01
    • 2020-02-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-04-15
    相关资源
    最近更新 更多