如何从一列中选择不同的值以插入到表中?

时间:2021-06-11 13:45:29

标签: sql oracle

这就是我正在尝试的,但出现此错误。

单行子查询返回多于一行。

我有这两个表:

表 2:

<头>
MY_NUM 描述 COL_2 阶段
123 苹果 信息 P1
124 橙色 信息 P1
124 橙色 INFO_2 P1
125 香蕉 信息 P2
125 香蕉 INFO_2 P2

表 3:

<头>
MY_NUM COL_1 项目 COL_3
123 信息 1 信息
123 INFO_2 1 INFO_2
124 信息 2 信息
124 INFO_2 2 INFO_2
125 信息 1 信息

我尝试的第一件事是

INSERT INTO table1 (MY_NUM, DESCRIPTION, PROJECT, PHASE)
SELECT t2.MY_NUM,
       t2.DESCRIPTION,
       t3.PROJECT,
       t2.PHASE,
  FROM table2 t2
 INNER JOIN table3 t3
       ON t2.MY_NUM = t3.MY_NUM;

我收到了这个错误。

违反了唯一约束 (DASHBOARD.TABLE1_UK1)

MY_NUM 与 table2 和 table3 中的多个值相关联,因此我尝试为 MY_NUM 的表添加唯一值。

INSERT INTO table1 (MY_NUM, DESCRIPTION, PROJECT, PHASE)
SELECT (SELECT DISTINCT MY_NUM
          FROM table2),
       t2.DESCRIPTION,
       t3.PROJECT,
       t2.PHASE
  FROM table2 t2
 INNER JOIN table3 t3
       ON t2.MY_NUM = t3.MY_NUM;

我收到了这个错误:

单行子查询返回多于一行

我想要这样的结果:

<头>
MY_NUM 描述 项目 阶段
123 苹果 1 P1
124 橙色 2 P1
125 香蕉 1 P2

其中 MY_NUM 不会有重复值。 我已经看到其他人正在使用的 partition by 和 group by 子句,但我不确定如何将其实现到我正在做的事情中。

2 个答案:

答案 0 :(得分:1)

使用修改后的数据,您只需添加 distinct 关键字:

INSERT INTO table1 (MY_NUM, DESCRIPTION, PROJECT, PHASE)
SELECT distinct
       t2.MY_NUM,
       t2.DESCRIPTION,
       t3.PROJECT,
       t2.PHASE
  FROM table2 t2
 INNER JOIN table3 t3
       ON t2.MY_NUM = t3.MY_NUM;

db<>fiddle

你似乎有非规范化的数据;例如,phase 值出现在同一 my_num 的两行中。如果它们总是匹配,那么也许应该有一个不同的表,其中只记录一次。事实上,它们最终可能会得到不同的值,这要么是数据完整性问题;或者这个查询需要决定使用哪个值,否则它会返回到 a constraint violation。然后,您必须决定如何选择 - 基于某些其他列或最大值/最小值等。

答案 1 :(得分:0)

当您拥有 MY_NUM 的结果时,为什么要使用 JOIN 的子查询?这不是你想要的吗?

INSERT INTO table1 (MY_NUM, COL_1, COL_2, COL_3)
    SELECT t2.MY_NUM, t2.COL_1, t3.COL_2, t2.COL_3
    FROM table2 t2 INNER JOIN
         table3 t3
         ON t2.MY_NUM = t3.MY_NUM;
相关问题