我有一个表连接的问题。
我有两个表: 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的价格。
发布于 2012-01-02 18:56:35
您需要结合使用内部联接和左(外)联接,并在联接条件中使用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中没有意义(并且会产生如下所示的错误
发布于 2012-01-02 19:03:01
由于您要为活动价格和默认价格查找不同的价格行,因此需要两个连接:一个用于默认价格(内部,因为默认值始终存在),另一个用于活动#3价格(外部,因为它可能不存在)。如果不为空,则COALESCE返回第一个操作数;否则,返回第二个操作数。
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发布于 2012-01-02 19:02:24
使用左连接
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) https://stackoverflow.com/questions/8699974
复制相似问题