根据查询中的特定分组插入两个表

Posted

技术标签:

【中文标题】根据查询中的特定分组插入两个表【英文标题】:Inserting into two tables based on specific grouping in query 【发布时间】:2019-01-22 13:47:12 【问题描述】:

我正在编写一个脚本,试图从查询中获取结果:

    SELECT
        OrdNumber,
        Detail1,
        Detail2,
        Detail3, 
        Date,
        Quantity,
        Customer,
        OrderingCode

    FROM Orders o
    INNER JOIN (SELECT os.*,
         row_number() over (partition by Detail1, Detail2,Detail3 ) as seqnum
    FROM orderSheets os
    ) os
      on o.product = os.product and
      o.Detail2 = os.Detail2 and
      o.Detail3 = os.Detail3 

并根据某些条件从那里获取必要的数据,并将关联的记录插入到两个表中。

我想根据该订单上该客户的不同 Detail1、Detail2 和 Detail3 对每个记录进行分组来插入,然后如果我有多个相同 detail1/detail2/detail3/ 的记录,则还要查看最高数量客户唯一分组

通过上面的查询,假设我返回了这些结果:

    OrdNumber |  Detail1 |  Detail2 |  Detail3 |     Date    | Quantity | Customer  | OrderingCode
    -----------------------------------------------------------------------------------------
    12345         122         123         12     12/12/2018        2       123         567
    12345         122         123         15     12/12/2018        2       123         567
    12345         516         123         63     12/12/2018        5       123         567
    12345         617         123         14     12/12/2018        7       123         567
    12345         617         123         14     12/12/2018        4       123         567
    12345         617         123         17     12/12/2018        2       123         567
    12345         745         123         43     12/12/2018        2       123         567

大多数结果已经不同,但我有两条记录在该订单(617、123、14)上为该客户共享相同的 detail1、detail2 和 detail3,因此在这种情况下,我只想插入一条记录将这两个结果(不同的详细信息、客户编号、订单号、日期和 orderingCode)和一个外国相关记录插入到产品表中,但我只想插入 2 条记录中的最高数量(所以在那例如,我将插入订单号、作为产品 ID 的外键和 7 作为数量,因为它是具有 7 和 4 的两条记录中的最高值)

所以有了上面的结果集,我想像这样将插入到两个表中:

产品

    ID   | Detail1 | Detail2 | Detail3 | Customer | OrderingCode |    Date 
    ----------------------------------------------------------------------------   
    1001    122        123       12        123        567          12/12/2018  
    1002    122        123       15        123        567          12/12/2018  
    1003    516        123       63        123        567          12/12/2018  
    1004    617        123       14        123        567          12/12/2018  
    1005    617        123       17        123        567          12/12/2018  
    1006    745        123       43        123        567          12/12/2018  

订单

    P_ID  |  Quantity  |      Date    |  orderNumber  
    -------------------------------------------------           
    1001         2        12/12/2018      12345               
    1002         2        12/12/2018      12345               
    1003         5        12/12/2018      12345               
    1004         7        12/12/2018      12345               
    1005         2        12/12/2018      12345               
    1006         2        12/12/2018      12345               

【问题讨论】:

太棒了。有什么问题? 如何根据该示例编写插入,以便我可以插入我需要的数据,如果同一客户有多个记录,detail1,detail2,detail3 然后我只插入一条记录并使用每个中的最高数量? 我认为max(quantity)group by customer,detail1,detail2,detail3 可能是查询的一部分。 插入行的ID/P_ID 值从何而来? products表中的ID为主键,P_ID作为外键使用 【参考方案1】:

有点复杂,但请按原样尝试:

create table Products (
  ID int not null generated always as identity primary key
, Detail1 int not null
, Detail2 int not null
, Detail3 int not null
, Customer int not null
, OrderingCode int not null
, Date date not null
) in userspace1;

create table Orders(
  P_ID int not null
, Quantity int not null
, Date date not null
, orderNumber int not null
, constraint orders_fk foreign key (p_id) references Products (id)
) in userspace1;

with r (OrdNumber, Detail1, Detail2, Detail3, Date, Quantity, Customer, OrderingCode) as (values
  (12345, 122, 123, 12, '12/12/2018', 2, 123, 567)
, (12345, 122, 123, 15, '12/12/2018', 2, 123, 567)
, (12345, 516, 123, 63, '12/12/2018', 5, 123, 567)
, (12345, 617, 123, 14, '12/12/2018', 7, 123, 567)
, (12345, 617, 123, 14, '12/12/2018', 4, 123, 567)
, (12345, 617, 123, 17, '12/12/2018', 2, 123, 567)
, (12345, 745, 123, 43, '12/12/2018', 2, 123, 567)
)
, p as (
select ID, Quantity, Date, ordNumber
from new table (
insert into products (Detail1, Detail2, Detail3, Customer, OrderingCode, Date)
include (OrdNumber int, Quantity int)
select Detail1, Detail2, Detail3, Customer, OrderingCode, Date, OrdNumber, Quantity
from (
select Detail1, Detail2, Detail3, Customer, OrderingCode, Date, OrdNumber, Quantity
, rownumber() over (partition by Detail1, Detail2, Detail3 order by Quantity desc) rn_
from r
) where rn_=1
)
)
select count(1) 
from new table (
insert into Orders (P_ID, Quantity, Date, orderNumber)
select ID, Quantity, Date, ordNumber
from p
);

在第一个WITH 子句(引用为r)中,您可以通过查询获得一个结果集。 然后使用从data-change operation 中选择的情侣。

第一个(引用为p)将所需的行插入Products,并为这些行生成IDs。

第二个(最新的)使用生成的 ID 和其他所需字段将行插入Orders

【讨论】:

谢谢,我会尽快尝试 我需要将 MAX 添加到数量吗?如果有任何记录被分组,我只想要最高数量 使用where rn_=1 子句的子选择为每个Detail1, Detail2, Detail3 组留下唯一具有最高数量的行。

以上是关于根据查询中的特定分组插入两个表的主要内容,如果未能解决你的问题,请参考以下文章

根据特定条件从表中获取已插入数据的插入查询

根据 SQL Server 2008 R2 中特定列中的模式更改对行进行分组

mysql中sql语句查询的同时根据条件将数据插入到另一个表的做法?

SQL如何根据一个字段的某个关键词的前面部分分组查询

根据 Redshift 中其他表的条目在表中插入值

mysql关联表分组查询多条数据