【问题标题】:SQL to include multiple joined property values, even if property type is missingSQL 包含多个连接的属性值,即使缺少属性类型
【发布时间】: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。它有什么问题 - 你得到一个错误,还是错误的结果?
  • 谢谢,亚历克斯。老实说,我实际上并没有运行它。我付出了很多努力让它看起来很漂亮,但校对不够。

标签: sql r oracle join


【解决方案1】:

我从来没有像你那样在JOINs 上看到过WHERE 子句,但你已经很接近了。我认为,将prop_type 作为JOIN 条件的一部分应该可以满足您的需求。

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'

【讨论】:

  • 我也在玩它,这是一个演示 @Politank-Z 答案的 sqlfiddle:sqlfiddle.com/#!4/347877/1
  • 您以前从未见过这样的符号,因为它完全是错误的。感谢您让我重回正轨。
  • @DaveD 哇,sqlfiddle 很棒。我在这里的全部错误是急于简化我的真实且有些大/复杂的表和查询。我真的不想在 Oracle 中创建饮料和属性表,所以我最终浪费了大家的时间。我已经用我可以用来快速测试的 R/sqldf 更新了我的问题。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-09-09
  • 2019-09-11
  • 2018-08-27
  • 1970-01-01
相关资源
最近更新 更多