2012-01-02 28 views
2

テーブル接合に問題があります。条件付きテーブルの結合

私は2つのテーブル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 

Unfortunnelyこのクエリは唯一CAMPAIGN_ID = NULLで私の価格を返します。

答えて

2

JOIN条件のcampaign_idフィルタを使用して、COALESCEのINNERとLEFT(OUTER)JOINの組み合わせを使用する必要があります。異なる行から2つの価格を1つの行にするには、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で

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) 
に参加
1

キャンペーン価格とデフォルト価格の異なる行を検索しているため、デフォルト価格(デフォルトは常に存在するため内部)とキャンペーン#3価格(アウター、存在しない可能性があるため)。 COALESCEは、最初のオペランドがNULLでない場合はそれを返します。それ以外の場合は、2番目のオペランドを返します。

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