Простой Postgres запрос не возвращает результата - PullRequest
1 голос
/ 29 марта 2020

У меня есть две таблицы:

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;

Разве не предполагалось возвращать данные из первой таблицы, независимо от того, есть ли какие-либо подходящие записи во 2-й таблице? Что я делаю не так?

1 Ответ

1 голос
/ 29 марта 2020

Фильтрация в предложении 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;
...