【问题标题】:How do I insert into or update a table with data from multiple other tables?如何使用来自多个其他表的数据插入或更新表?
【发布时间】:2021-06-18 22:48:12
【问题描述】:

我有几张桌子:

表 1:

USER_NAME USER_NUM
Billy Bob Q1
Billy Joe Q2
John Doe Q3

表2:

USER_NUM USER_ID
Q1 1
Q2 2
Q3 3

表3:

USER_ID MATERIAL_NUMBER
1 M1
1 M2
2 M1
2 M3
3 M3

table4:

MATERIAL_ID MATERIAL_NUMBER
111 M1
112 M2
113 M3

这就是我希望 table5 的外观:

OWNER_ID MATERIAL_ID USER_NUM USER_NAME
222 111 Q1 Billy Bob
223 111 Q2 Billy Joe
224 112 Q1 Billy Bob
225 113 Q2 Billy Joe
226 113 Q3 John Doe

该表已经填写了OWNER_IDMATERIAL_ID,所以我只需要USER_NUMUSER_NAME,除非从头开始重新填充它会更容易。

这是我尝试过的查询,但它根本不起作用(我得到 row is ambiguously defined 错误):

UPDATE table5 t5
   SET t5.USER_NUM = (SELECT UPPER(t1.USER_NUM)
                        FROM table1 t1
                       INNER JOIN table2 t2
                          ON t1.USER_NUM = t2.USER_NUM
                       INNER JOIN table3 t3
                          ON t2.USER_ID = t3.USER_ID
                       INNER JOIN table4 t4
                          ON t3.MATERIAL_NUM = t4.MATERIAL_NUM
                       WHERE t4.MATERIAL_ID = t5.MATERIAL_ID);

一旦我在那里得到USER_NUM,用USER_NAME 更新表的查询应该很容易,但如果有人知道如何同时执行这两个操作,那也很好 =)

【问题讨论】:

  • 您了解规范化并有意想要一个非规范化表吗?如果没有,您应该对规范化进行一些研究,并意识到将这些列放在第 5 个表中通常是一件坏事。如果是,那么你应该三思而后行,如果非规范化真的对你有帮助,那么它值得冒险。您也可以edit您的问题并详细说明实际问题以获得有关该主题的进一步建议。
  • 我正在尝试将我想要的数据整合到 1 个表中,以便于使用。我不熟悉规范化。设置我的数据库的人在没有主键/外键或唯一值的情况下构建了表。我是一名实习生/大学生,只使用 SQL 3 个月。我周围没有任何其他开发人员寻求帮助,我只是被交给了别人的项目。他们在我来之前就已经走了,所以我什至不能问他们为什么要这么做。
  • 好的,那么正如我所说,研究标准化的主题。 “易于使用”并不是非规范化的一个特别好的理由。为方便起见,您可以使用相应的连接创建一个视图,但您不应该在表格中实现它。
  • 我正在尝试重新设计表格,使它们井井有条,并与我正在尝试开发的应用程序的目标相符合。
  • 我会研究标准化。

标签: sql oracle


【解决方案1】:

我建议将数据插入其中,而不是更新 table5。我创建了一个名为 table5_seq 的序列,然后将其选为OWNER_ID

 create table table1(USER_NAME varchar(50), USER_NUM varchar(50));

 insert into table1 values('Billy Bob', 'Q1');
 insert into table1 values('Billy Joe', 'Q2');
 insert into table1 values('John Doe',  'Q3');

 create table table2(USER_NUM varchar(50),  USER_ID int);
 insert into table2 values('Q1',    1); 
 insert into table2 values('Q2',    2);
 insert into table2 values('Q3',    3);
 
 create table table3 (USER_ID int, MATERIAL_NUMBER varchar(50));
 insert into table3 values(1    ,'M1');
 insert into table3 values(1    ,'M2'); 
 insert into table3 values(2    ,'M1'); 
 insert into table3 values(2    ,'M3'); 
 insert into table3 values(3    ,'M3');
  
 create table table4 (MATERIAL_ID int,  MATERIAL_NUMBER varchar(50));
 insert into table4 values(111  ,'M1'); 
 insert into table4 values(112  ,'M2');
 insert into table4 values(113  ,'M3');

 create table table5(OWNER_ID int,  MATERIAL_ID varchar(50),    USER_NUM varchar(50),   USER_NAME varchar(50));     

 CREATE SEQUENCE table5_seq
  START WITH     1
  INCREMENT BY   1
  NOCACHE
  NOCYCLE;     

插入查询:

 insert into table5
 SELECT table5_seq.NextVal,t4.MATERIAL_NUMBER, UPPER(t1.USER_NUM) USER_NUM,UPPER(t1.USER_NAME)USER_NAME
     FROM table1 t1
     INNER JOIN table2 t2
         ON t1.USER_NUM = t2.USER_NUM
     INNER JOIN table3 t3
         ON t2.USER_ID = t3.USER_ID
     INNER JOIN table4 t4
         ON t3.MATERIAL_NUMBER = t4.MATERIAL_NUMBER;

输出:

OWNER_ID MATERIAL_ID USER_NUM USER_NAME
1 M1 Q1 BILLY BOB
2 M1 Q2 BILLY JOE
3 M2 Q1 BILLY BOB
4 M3 Q2 BILLY JOE
5 M3 Q3 JOHN DOE

或者按照 Gordon 的建议,您也可以创建一个视图:

 create view view_table5 
 as
     SELECT t4.MATERIAL_NUMBER, UPPER(t1.USER_NUM) USER_NUM,UPPER(t1.USER_NAME)USER_NAME
     FROM table1 t1
     INNER JOIN table2 t2
         ON t1.USER_NUM = t2.USER_NUM
     INNER JOIN table3 t3
         ON t2.USER_ID = t3.USER_ID
     INNER JOIN table4 t4
         ON t3.MATERIAL_NUMBER = t4.MATERIAL_NUMBER;


 select * from view_table5;

输出:

MATERIAL_NUMBER USER_NUM USER_NAME
M1 Q1 BILLY BOB
M1 Q2 BILLY JOE
M2 Q1 BILLY BOB
M3 Q2 BILLY JOE
M3 Q3 JOHN DOE

db小提琴here

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2018-07-21
    • 2011-12-14
    • 1970-01-01
    • 2011-06-29
    • 1970-01-01
    • 1970-01-01
    • 2022-01-16
    相关资源
    最近更新 更多