I have two tables:
products(id: integer, price: float, website_id: integer)
and
adjustments(id: integer, product_id: integer, website_id: integer, factor:float)
I have indexes on id in both tables, and an index on website_id and product_id on the adjustments table.
This query returns data but it takes some 5 seconds with some 1k products and a couple hundred in adjustments:
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;
This other query however returns no results when there’s nothing in the adjustments table:
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;
Was it not supposed to return the data from the first table regardless if there are any matching record in the 2nd table? What am I doing wrong?
Advertisement
Answer
The filtering in the where
clause if applied after the join. So here, you get all the rows from products
, and match them with empty adjustments
rows (since the table is empty). Then, you apply the where
condition, that includes adjustments.website_id = 1
since adjustment.website_id
is always null
, no rows are returned.
You could move this condition to the join
in order to get the behavior you expected:
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;