Oracle SQL:根据在另一个表中给定条件的列中找到的值插入
Posted
技术标签:
【中文标题】Oracle SQL:根据在另一个表中给定条件的列中找到的值插入【英文标题】:Oracle SQL: Insert based on found value in a column given condition from another table 【发布时间】:2014-05-21 15:22:09 【问题描述】:我想将我的订单数据合并到一个表中,该表现在位于两个单独的表中: Orders 表中的订单 ID 和客户代码:
Order_ID Customer
1 C11
2 C76
4 C32
以及详细信息表中的订单详情(包含 Order_ID、Hour、Quantity 列),其中给出了订单有效小时的订购数量:
Order_ID Hour Quantity
1 2 10
1 3 20
2 2 5
2 3 5
2 4 5
4 6 20
4 7 25
我想将这两个表的数据合并到一个表中,通过在相应列中插入订单有效小时数的数量,每个订单只有一行,否则为零。
Order_ID Cutomer Hour1 Hour2 Hour3 Hour4 Hour5 Hour6 Hour7 ...
1 C11 0 10 20 0 0 0 0
2 C76 0 5 5 5 0 0 0
4 C32 0 0 0 0 0 20 25
我试过了(仅适用于第 1 小时的数量):
insert into Merged_Order_Table
(Order_ID,Customer,Hour1)
select
Orders.Order_id,Orders.Customer,
case
when 1 in (select Details.Hour from Details,Orders where
Details.Order_ID = Orders.Order_ID)
then Details.Quantity
else 0
end
from
Orders
inner join
Details
on
Details.Order_ID = Orders.Order_ID;
但即使对于这一小时内没有数量的订单,也会在 Hour1 获得数量。
【问题讨论】:
当您在详细信息表中没有出现一个小时时会发生什么,您将更改表结构?那就是说搜索 PIVOT 作为初学者,我想我需要更多帮助。我的查询显然是错误的,因为我在运行时得到 Order_ID=1(2 行): Order_ID Cutomer Hour1 1 C11 10 1 C11 10 而该订单在 Hour1 中没有数量。我对此查询的预期输出是:Order_ID Cutomer Hour1 1 C11 0 这不是关于查询,而是关于想法。如果明天有一个新的 Hour 值,设为 47,出现在 Details 中会发生什么?新表将没有它,您需要删除并重新创建它。除非您确定 Hour 字段的值已完全映射,否则可能会发生这种情况(即使您认为已映射数据,它仍然可能发生)。返回旋转数据的SELECT
更有意义。
啊哈,我只是把这张合并表作为辅助表来提取订单的“结构”。我没有删除原始表,只是不知道如何编写输出结构的查询(仅 Hour_xs)。稍后我需要对具有“相同”结构的订单运行另一个查询。所以,这是我谦虚的做法:)
【参考方案1】:
我质疑您为什么要获取经过良好规范化的数据并将其放入具有该结构的 table 中。我可以理解一个查询返回这样的数据,但是另一个表?
无论如何,您的问题是使用相关子查询时的常见问题。被关联的表包含在子查询中。哎呀。这是解决此问题的方法:
insert into Merged_Order_Table(Order_ID, Customer, Hour1)
select o.Order_id, o.Customer,
(case when 1 in (select d.Hour from Details d where d.Order_ID = o.Order_ID)
then d.Quantity
else 0
end)
from Orders o;
也就是说,你真正想要的是条件聚合:
insert into Merged_Order_Table(Order_ID, Customer, Hour1)
select o.Order_id, o.Customer,
sum(case when d.Hour = 1 then d.Quantity else 0 end)
from Orders o left join
Details d
on o.Order_ID = d.Order_ID
group by o.Order_id, o.Customer;
【讨论】:
【参考方案2】:你在正确的轨道上!
你只需要多一层:
select order_id, customer, max(quantity) hour1 from
(your query)
group by order_id, customer
或者你可以看看如何做PIVOT 表
【讨论】:
以上是关于Oracle SQL:根据在另一个表中给定条件的列中找到的值插入的主要内容,如果未能解决你的问题,请参考以下文章