2012-01-02 101 views
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

您需要將INNER和LEFT(OUTER)JOIN與COALESCE混合使用,並在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

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返回它的第一個操作數,如果它不爲空;否則,它返回第二個操作數。

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