2016-09-15 57 views
1

我有兩個表:PostgreSQL的COALESCE不設置默認值

tcars

id |   name  | car_price 
----|---------------------|------------ 
    1 |First_car_name  |  1000 
    2 |Second_car_name  |  1200 

tcar_optionals

id | id_car | spec | opt_included |price 
----|----------|------|------------------------- 
1 |  2 |Spec1 | true   | 500 
2 |  2 |Spec2 | true   | 100 
3 |  2 |Spec3 | false   | 500 
4 |  2 |Spec4 | true   |  0 
5 |  1 |Spec5 | false   | 500 
6 |  1 |Spec6 | true   |  0 

而下面的查詢:

select t1.id, coalesce(t1.car_price, 0)+ coalesce(sum(t2.price), 0) as total_price 
from tcars t1 
    left join tcar_optionals t2 on t2.id_car = t1.id 
where t2.opt_included and t2.price>0 and t1.id=? 
group by t1.id, t1.car_price 

它從tcars和total_price(car_price +包含價格> 0的optionals的價格)返回id。

實施例:

t1.id=2回報:

id | total_price 
----|------------ 
2 | 1800 

當我有價> 0不包括自選,例如t1.id = 1

什麼它返回出現問題:

id | total_price 
----|------------ 

我需要的僅僅是返回t1.car_price作爲total_價格如果沒有包含可選價格> 0:

id | total_price 
----|------------ 
1 |  1000 

有人可以幫我解決這個問題嗎?

回答

1

select (t1.car_price + coalesce(extra_price, 0)) as start_price 
 
from tcars t1 
 
left join (select id_car,sum(price) as extra_price from tcar_optionals 
 
where opt_included and price > 0 group by 1) q1 on q1.id_car = t1.id 
 
where t1.id=$1

2

其中條款有效地把你的外在條件q1.id_car=1加入到內部聯接,因爲行不匹配連接條件q1.id_car將是無效和比較=1將再次刪除這些行。

您將需要它放入JOIN條件 - 但你已經對id_car條件派生表(「Q1」),你不需要也無妨。

的另一種可能性是從tcars表上的相應值過濾:where t1.id = 1


編輯

通過在t2表移動條件下的連接條件你得到你想要什麼:

select t1.id, coalesce(t1.car_price, 0) + coalesce(sum(t2.price), 0) as total_price 
from tcars t1 
    left join tcar_optionals t2 
      on t2.id_car = t1.id 
      and t2.opt_included and t2.price > 0 --<< conditions for tcar_optionals go here 
where t1.id = 1 --<< limit the car you want to see 
group by t1.id; 

if id i s被定義爲tcars中的主鍵,那麼group by t1.id就足夠了。

在這裏看到的例子:http://rextester.com/YOYF30261

+0

我需要q1.id_car = 1;對於返回特定車輛的價格,如果我刪除這條線路,查詢將返回我的分貝中所有車輛的價格 – Kuzuri

+0

@Kuzuri:您可以使用'where t1.id = 1將總體結果限制爲僅一輛車' –

+0

我知道,如果我沒有包含任選項,我需要從這個查詢中返回車的價格。 假設我有兩輛車:tcar中id = 1,id = 2,tcar_specs中id_car = 1,id_car = 2。第一輛車的價格是1000,我有兩個包括可選項(第一個價格是100和第二個150),查詢將返回1250,第二輛車的(id_car = 2)價格是900,我沒有包含可選項,應該返回900但它不,它什麼都不返回。 – Kuzuri

2

你應該首先加入與該第二表中的所有條件和彙總值的表(加入)的結果,即G:

select id, coalesce(car_price, 0)+ coalesce(sum(price), 0) total_price 
from tcars 
left join tcar_optionals on id = id_car and spec_included 
-- where id = 1 
group by id, car_price 
+0

同樣的結果,沒有行,如果我沒有包括可選項 – Kuzuri

+0

這是不可能的。我在查詢中改變了一些內容嗎?參見[SqlFiddle](http://sqlfiddle.com/#!15/07296/1) – klin