【发布时间】:2015-04-20 18:31:31
【问题描述】:
此问题基于“SQL for ignoring rows that have a particular property from a joined table”。我得到了有用的答案和 cmets,但我决定与我最初的请求不同。
我有两张桌子:drinks 和 properties。他们可以通过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子句更改为and。它有什么问题 - 你得到一个错误,还是错误的结果? -
谢谢,亚历克斯。老实说,我实际上并没有运行它。我付出了很多努力让它看起来很漂亮,但校对不够。