我有一个查询,该查询从表中选择产品。一个产品可以有多个价格(可以考虑各种价格)和一个默认价格。
自然,这是一对多关系。我需要选择具有给定价格或默认价格的产品- 这意味着互斥。我知道可以通过单独的查询和WHERE(不是)IN子句或并集语句来完成此操作,但是我坚信必须有一种更好的方法。我的查询当前如下所示:
SELECT products.*, products_prices.price FROM products RIGHT JOIN products_prices ON (products.id = products_prices.productId) WHERE products_prices.businessId = ? OR products_prices.businessId IS NULL // this needs to become mutual.
编辑:我最终使用此查询,这是Gordon Linoff的稍作修改的版本:
SELECT distinct p.*, coalesce(pp.price, defpp.price) FROM products p LEFT JOIN products_prices pp ON p.id = pp.productId and pp.businessId = ? left join products_prices defpp on p.id = defpp.productId and defpp.businessId is NULL
如果我正确理解您的问题,则该products表将具有默认价格,而该product_prices表将具有任何其他价格。
products
product_prices
您想知道默认价格在哪里使用,这意味着没有其他价格。为此,请使用left outer join:
left outer join
SELECT p.*, coalesce(pp.price, p.default_price) FROM products p LEFT OUTER JOIN products_prices pp ON p.id = pp.productId WHERE pp.price = GIVENPRICE or pp.price is null
根据您的评论,您将默认价格存储在业务ID为NULL的记录中。在这种情况下,我将对价格表进行两次联接:
SELECT p.*, coalesce(pp.price, defpp.price) FROM products p LEFT OUTER JOIN products_prices pp ON p.id = pp.productId and pp.price = GIVENPRICE left outer join products_prices defpp on p.id = defpp.productId and defpp.businessId is NULL
第一个联接获得与给定价格匹配的价格。第二个获取默认价格。如果存在,则使用第一个结果,否则,使用第二个结果。