此問題是基於「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)
這看起來應該做你想做的?至少如果在選擇列表中也包含'sweetprop.prop_val',並且將兩個'where'從句改爲'和'。它有什麼問題 - 你是否收到錯誤或錯誤的結果? –
謝謝,亞歷克斯。老實說,我沒有真正運行它。我付出了很多努力,使它看起來很漂亮,而且還不足以用於校對。 –