【问题标题】:Insert Into Third Table Based Two Another- oracle插入基于两个另一个-oracle 的第三个表
【发布时间】:2021-08-17 05:20:39
【问题描述】:

我有这三张桌子;假设表(尤其是 A)的数据量非常大,如何从 b_table 和 a_table 插入表 C (c_table):

表 B:

CREATE TABLE b_table 
(
     NAME varchar2(10),
     ID number PRIMARY KEY
)

表 A:

CREATE TABLE a_table 
(
     CODE number,
     RATE number,
     DATEE date, 

     CONSTRAINT fk_a_table 
         FOREIGN KEY (CODE) REFERENCES b_table(ID)
);

表 C:

CREATE TABLE c_table 
(
     DATEE date,
     USD number, 
     EUR number,
     OBP number 
); 
    

【问题讨论】:

  • “表 A”被称为 b_table,而“表 B”被称为 a_table ?!?!?这违反了所有最小意外原则!!
  • 这能回答你的问题吗? Oracle SQL pivot query
  • @astentx Thins 非常接近,但我的问题是按日期对行进行分组
  • @marc_s 感谢您提及这一点。我正在编辑问题
  • 只是对桌子设计的评论:您应该与您的名字保持一致。如果您在货币表中将货币 ID 称为 id,则不要在汇率表中将其称为 code。例如,称之为currency_id。然后,对于您当前的两个表,您可以考虑使用自然键。 USD 和 EUR 是永远不会更改的 ISO 代码,因此您可以将它们用作数据库中的键。 (不过,我不知道 OBP 是什么。如果表中确实包含 ISO 未知的“货币”,那么使用该列作为自然键可能不是一个好主意。)

标签: sql oracle sql-insert


【解决方案1】:

您可以使用条件聚合:

insert into c_table (DATEE, USD, EUR, OBP) 
    select a.DATEE,
           max(case WHEN a.code = 1 THEN a.rate end),
           max(case WHEN a.code = 2 THEN a.rate end),
           max(case WHEN a.code = 3 THEN a.rate end)
    from a_table a
    group by a.DATEE

【讨论】:

  • 完全正确的答案。非常感谢
【解决方案2】:
begin
for r in(
    with m as(
        select 1 as xcode, 1000 as xrate, sysdate as xdate from dual
        union all
        select 2, 2000, sysdate from dual
        union all
        select 3, 3000, sysdate-1 from dual
        union all
        select 1, 2000, sysdate from dual
        union all
        select 2, 4000, sysdate from dual
        union all
        select 3, 5000, sysdate-2 from dual
        )
        select * from m
                pivot(
                    sum(xrate) for xcode in (
                        1     as usd,
                        2     as eur,
                        3     as gbp
                        ))
)loop
    update your_table set foo = r.xrate, foo_currency_usd = x.usd where foo_date = r.date;
    end loop;
end;

【讨论】:

  • 谢谢,但我认为这不是答案,也不能帮助解决这个问题
  • 如果您使用测试值而不是地雷,则输出应该相同
【解决方案3】:

试试下面的代码。

INSERT INTO c_table(DATEE, USD, EUR, OBP)
     Select DATEE, USD, EUR, OBP  from(
            Select 
              TO_CHAR(a.DATEE,'DD-MON-YYYY') DATEE, a.Rate, b.name from a_table a
            inner join b_table b on b.id=a.code
        )PIVOT(SUM(rate)for name in ('USD' USD, 'EUR' EUR,'OBP' OBP));

【讨论】:

    猜你喜欢
    • 2023-03-04
    • 2021-05-17
    • 2023-03-15
    • 1970-01-01
    • 2018-03-23
    • 1970-01-01
    • 2016-01-05
    • 2021-11-23
    • 2019-06-14
    相关资源
    最近更新 更多