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:根据在另一个表中给定条件的列中找到的值插入的主要内容,如果未能解决你的问题,请参考以下文章

oracle/sql中如何根据条件向表中插入数据

在另一个表的 select 子句中使用一个表中的列值

获取存储在另一个表中的列的定义而不连接两次

从oracle表中选择sql server表中的列

sql : 在另一个表中显示有条件的数据

根据另一个表中的条件显示表中的列