2015-04-20 38 views
0

此問題是基於「SQL for ignoring rows that have a particular property from a joined table」。我得到了有用的答案和評論,但我決定採用與原始請求不同的方向。SQL包含多個聯合屬性值,即使屬性類型丟失

我有兩個表:飲料和屬性。他們可以通過drink_id加入。屬性有幾種可能的類型。我想創建一個報告飲料的查詢,即使它爲空,每個屬性都有一列。如果同一個飲料有多個相同的屬性類型,我想我會希望所有的笛卡爾組合,但這不是

Oracle 11,如果這有所作爲。

+----------+--------------+-------------+ 
| drink_id | drink_name | drink_brand | 
+----------+--------------+-------------+ 
|  1 | orange juice | tropicana | 
|  2 | seltzer  | schweppes | 
|  3 | cola   | pepsi  | 
|  4 | diet cola | pepsi  | 
+----------+--------------+-------------+ 

+----------+-----------+-----------+ 
| drink_id | prop_type | prop_val | 
+----------+-----------+-----------+ 
|  1 | color  | orange | 
|  2 | color  | clear  | 
|  3 | color  | brown  | 
|  4 | sweetener | aspartame | 
+----------+-----------+-----------+ 

所需的輸出:

+--------------+-------------+-------------+-----------+ 
| drink_name | drink_brand | drink_color | sweetener | 
+--------------+-------------+-------------+-----------+ 
| orange juice | tropicana | orange  | <null> | 
| seltzer  | schweppes | clear  | <null> | 
| cola   | pepsi  | brown  | <null> | 
| diet cola | pepsi  | <null>  | aspartame | 
+--------------+-------------+-------------+-----------+ 

我在想這樣的事情,但我不知道如何將行如果一個或兩個屬性不適用於給定的飲料。

select drink_name, drink_brand, colorprop.prop_val as drink_color 
from drinks 
left join properties colorprop 
on drinks.drink_id = colorprop.drink_id 
where colorprop.prop_type = 'color' 
left join properties sweetprop 
on drinks.drink_id = sweetprop.drink_id 
where sweetprop.prop_type = 'sweetener' 

更新: 正如評論和答覆中指出,我的問題大多是倉促的語法錯誤。我可以用下面的R代碼裏面測試這樣:

library(sqldf) 
drinks <- data.frame(drink_id = c(1,2,3,4), 
    drink_name = c("orangejuice", "seltzer", "cola", "dietcola"), 
    drink_brand = c("tropicana", "schweppes", "pepsi", "pepsi")) 
names(drinks) <- c("drink_id", "drink_name", "drink_brand") 

properties <- data.frame(drink_id = c(1,2,3,4), 
    prop_type = c("color", "color", "color", "sweetener"), 
    prop_val = c("orange", "clear", "brown", "aspartame")) 
names(properties) <- c("drink_id", "prop_type", "prop_val") 

drinkquery <- 
"select drink_name, drink_brand, 
    colorprop.prop_val as drink_color, sweetprop.prop_val as sweetener 
    from drinks 
    left join properties colorprop 
    on drinks.drink_id = colorprop.drink_id AND colorprop.prop_type = 'color' 
    left join properties sweetprop 
    on drinks.drink_id = sweetprop.drink_id AND sweetprop.prop_type = 'sweetener'" 

sqldf(drinkquery) 
+1

這看起來應該做你想做的?至少如果在選擇列表中也包含'sweetprop.prop_val',並且將兩個'where'從句改爲'和'。它有什麼問題 - 你是否收到錯誤或錯誤的結果? –

+0

謝謝,亞歷克斯。老實說,我沒有真正運行它。我付出了很多努力,使它看起來很漂亮,而且還不足以用於校對。 –

回答

3

我從來沒有見過在JOIN小號WHERE條款喜歡你,但你很接近。我認爲,讓prop_type條件的一部分應該可以讓你找到你正在尋找的東西。

select drink_name, drink_brand, colorprop.prop_val as drink_color, 
sweetprop.prop_val as sweetener 
from drinks 
left join properties colorprop 
on drinks.drink_id = colorprop.drink_id AND colorprop.prop_type = 'color' 
left join properties sweetprop 
on drinks.drink_id = sweetprop.drink_id AND sweetprop.prop_type = 'sweetener' 
+1

我還在玩它,這裏是一個sqlfiddle,演示@ Politank-Z的回答:http://sqlfiddle.com/#!4/347877/1 –

+0

你以前從來沒有見過這樣的符號,因爲它顯然是錯誤的。感謝您讓我回到正軌。 –

+0

@DaveD哇,sqlfiddle是偉大的。我在這裏犯的錯誤是急於簡化我的真實的,有些大/複雜的表格和查詢。我真的不想在Oracle中創建飲料和屬性表,所以我最終浪費了每個人的時間。我用R/sqldf更新了我的問題,我可以用它來進行快速測試。 –