表格加入时遇到问题。
我有两个表:product_commons和product_prices。 Product_prices包含标准产品价格+预先生成的广告系列价格(campaign_id)的记录。我需要一个查询,它会返回包含广告系列价格(如果存在)或标准价格(如果不存在)的产品列表。
这样的事情:
SELECT * FROM product_commons
INNER JOIN product_prices ON product_commons.id = product_prices.product_id
WHERE (campaign_id = 3 OR campaign_id IS NULL)
GROUP BY product_commons.id
不幸的是,此查询只返回campaign_id = NULL的价格。
答案 0 :(得分:2)
您需要在COALESCE中混合使用INNER和LEFT(OUTER)JOIN,并在JOIN条件中使用campaign_id过滤器。要将不同行中的2个价格分成一行,您需要2个JOIN。
SELECT
*,
COALESEC(pstd.price, pc.price)
FROM
product_commons pc
JOIN
product_prices pstd ON pc.id = pstd.product_id AND pstd.campaign_id IS NULL;
LEFT JOIN
product_prices pp ON pc.id = pp.product_id AND pp.campaign_id = 3;
您也不需要GROUP BY:它在标准SQL或其他RDBMS中没有意义(并且会像这样使用错误)
答案 1 :(得分:1)
由于您要查找广告系列价格和默认价格的不同价格行,因此您需要两个连接:一个用于默认价格(内部,因为默认值始终存在)和一个用于广告系列#3价格(外部,因为它可能不存在)。 COALESCE
返回第一个操作数,如果它不为null;否则,它返回第二个操作数。
SELECT *,COALESCE(c3_price.price,def_price.price)
FROM product_commons
LEFT OUTER JOIN product_prices c3_price ON product_commons.id = c3_price.product_id and c3_price.campaign_id = 3
INNER JOIN product_prices def_price ON product_commons.id = def_price.product_id and def_price.campaign_id IS NULL
答案 2 :(得分:0)
使用左连接
Select * FROM product_commons LEFT JOIN product_prices ON product_commons.id = product_prices.product_id WHERE (campaign_id = 3 OR campaign_id IS NULL)