【问题标题】:select statement multi tables with a new colums whose value dependson other in different table选择语句具有新列的多表,其值取决于不同表中的其他列
【发布时间】:2020-01-17 07:13:38
【问题描述】:

我有一个表,其中包含引用其他表中其他行的列或不引用。 例如: - 表 Table_Cart 有一个列 product 作为数字 - 如果产品是水果,那么它指向表 Table_Fruit 中的一行, - 如果产品是蔬菜,那么它指向表 Table_Vegetable 中的一行 - 如果以上都不是,我们可以将值保留为空

我需要生成一个输出,例如说明每种产品是否为“水果”/“蔬菜”/空 所以它应该看起来像

| product | category |
| 1111111 | fruit    |
| 2222222 | vegetable|
| 1111113 | fruit    |
| 4444444 |          |

今天写的sql是

select T1.product, T2.category
from Table_Cart T1 left join
     (select product, "fruit" as "category" from Table_fruit
      union
      select product, "vegetable" as "category" from Table_vegetable
     ) T2
     on T1.product = T2.product

有没有更好的写法?

谢谢

【问题讨论】:

  • 我还不明白。购物车表包含一个产品 ID。但是不存在产品表。相反,你有一张水果桌和一张蔬菜桌,也许还有其他桌子。购物车的产品 ID 引用水果表中的一行或蔬菜表中的一行,或者两者都不引用。您会看到它保证同时在水果表和蔬菜表中都不存在 ID。这是正确的吗?
  • 这看起来是一个非常不幸的数据模型。是否有一些严重的理由为每种产品类型使用单独的表而不是一个通用产品表?
  • 至于您的查询: 1. 引号不正确,正如 Tejash 的回答中已经提到的那样。 2. 当你实际上只想要UNION ALL 时,不要使用UNIONUNION 具有查找重复项并将其删除的附加任务。 3. 养成使用助记别名的习惯。 T1T2 使查询的可读性降低,例如,ccart 用于 table_cartpprod 用于联合产品表。
  • 感谢 cmets 和关于数据模型,我不知道为什么要这样设计

标签: sql oracle select


【解决方案1】:

你可以避免使用子查询,直接LEFT JOIN如下:

 SELECT
     T.PRODUCT,
     CASE
         WHEN TF.PRODUCT IS NOT NULL THEN 'fruit'
         WHEN TV.PRODUCT IS NOT NULL THEN 'vegetable'
     END AS CATEGORY
 FROM
     TABLE_CART T
     LEFT JOIN TABLE_FRUIT TF ON ( T.PRODUCT = TF.PRODUCT )
     LEFT JOIN TABLE_VEGETABLE TV ON ( T.PRODUCT = TV.PRODUCT )

另外,请注意"(双引号)为列的常量值("fruit", "vegetable")是不正确的,它应该被包裹在'(单引号)中,如('fruit', 'vegetable' )

干杯!!

【讨论】:

  • 感谢cmets的解答
猜你喜欢
  • 1970-01-01
  • 2016-03-11
  • 1970-01-01
  • 2022-11-10
  • 1970-01-01
  • 2017-11-11
  • 2021-07-28
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多