【问题标题】:Normalising a table in Oracle SQL在 Oracle SQL 中规范化表
【发布时间】:2013-07-05 16:59:30
【问题描述】:

想知道是否有人可以就如何最有效地规范化下表提供一些指导,以便我可以创建可刷新的视图/表。

表1:

SYSTEM_KEY | ID | ORDER | ORDER_STATUS | SYSTEM_Actions
A             1   Pencil   Open          Shipped   
B             1   Pencil   Open          Tested  
C             1   Pencil   Open          Shipped    
A             1   Paper    Closed        Delivered

我希望以可重复的方式将此表标准化为如下所示:

结果:

ID | ORDER | Order Status | A_actions | B_Actions | C_Actions 
1    Pencil  OPEN           Shipped     Tested      Delivered                   
1    Paper   Closed         Delivered    null       null

我可以通过做类似的事情来实现这一点

Select full.ID, full.order, full.orderstatus, case when system_ID = 'A' then sysa.system_actions as A_actions, ....{for B, C} 
from table1 full
left join table1 sysa on full.id = sysa.id and full.order = sysa.order
left join table1 sysb on full.id = sysb.id and full.order = sysb.order  

虽然这似乎可行,但在必须使用多个临时表的可重复性方面非常笨拙。

有谁知道我是否可以实现这一目标的好方法?

【问题讨论】:

  • 查找 PIVOT 或 MODEL 或 SUM(CASE ... )。仅此一项就必须有数百个示例。
  • 这不是标准化。事实上,它的规范化程度甚至低于原始表格。
  • 您的建议是通过添加一组重复的操作来对表进行 DENORMALIZE。也许你应该考虑一下。您提议的更改将使表格更难处理,将导致处理它的代码更加复杂和容易出错,将在您的头上和您的后代上召唤七代神的愤怒,并可能导致终结我们所知道的世界。祝你好运。

标签: sql oracle plsql normalization normalize


【解决方案1】:

尝试使用 group by 子句

select id,order,order_status,
       case when system_ID = 'A' then system_actions as A_actions,
       case when system_ID = 'B' then system_actions as B_actions,
       case when system_ID = 'C' then system_actions as C_actions
from table1
group by id,order,order_status

【讨论】:

    猜你喜欢
    • 2011-03-31
    • 2012-12-31
    • 2017-07-31
    • 2013-02-15
    • 2013-11-21
    • 1970-01-01
    • 2015-09-23
    • 2011-06-06
    • 2014-10-03
    相关资源
    最近更新 更多