如何从同一 table 中的现有列向 table 添加新列?

How to add new column in a table from existing column in the same table?

我有一个只有 1 列的 table,其中有几个连接到其中的详细信息,如产品名称、发货日期等:

MASTERCOLUMN
Row1_Prod1_ShipDate_01-Dec-21
Row2_Prod2_ShipDate_03-Dec-21
Row3_Prod3_ShipDate_07-Dec-21
.
.

要求添加另外 2 列,仅包含对应于 MASTERCOLUMN 的 ProductName 和 ShipmentDate 详细信息:(例如以下)

MASTERCOLUMN                    ProductName   ShipmentDate
Row1_Prod1_ShipDate_01-Dec-21   Prod1         01-Dec-21
Row2_Prod2_ShipDate_03-Dec-21   Prod2         03-Dec-21
Row3_Prod3_ShipDate_07-Dec-21   Prod3         07-Dec-21
.
.
.

我更改了 table 并添加了这些新列。有什么方法可以更新 table 以便将相应的值复制到这些新列中吗?这可以使用 SQL 查询来实现吗?我正在使用 SQL Developer with Oracle 19.c 版本。

我尝试在添加 2 列后更新列.. 以下示例查询用于更新 ProductName 列:

UPDATE TABLE
SET ProductName = (SELECT SUBSTR(MASTERCOLUMN,6,5) FROM TABLE);

但是这个returns ORA-01427: 单行子查询returns多行错误。

但是,我尝试只更新一行并且效果很好;

UPDATE TABLE
SET ProductName = (SELECT SUBSTR(MASTERCOLUMN,6,5) FROM TABLE)
WHERE MASTERCOLUMN = 'Row1_Prod1_ShipDate_01-Dec-21';

但我需要用 MASTERCOLUMN 列中的相应值填充整个 table..

不要使用子查询,你不需要它。

示例 table 和行数:

SQL> create table test (mastercolumn varchar2(30));

Table created.

SQL> insert into test
  2    select 'Row1_Prod1_ShipDate_01-Dec-21' from dual union all
  3    select 'Row2_Prod2_ShipDate_03-Dec-21' from dual union all
  4    select 'Row3_Prod3_ShipDate_07-Dec-21' from dual;

3 rows created.

添加新列:

SQL> alter table test add
  2    (product_name varchar2(10),
  3     shipmentdate date);

Table altered.

更新:

SQL> update test set
  2    product_name = substr(mastercolumn,
  3                          instr(mastercolumn, '_', 1, 1) + 1,
  4                          instr(mastercolumn, '_', 1, 2) - instr(mastercolumn, '_', 1,1 ) - 1
  5                         ),
  6    shipmentdate = to_date(substr(mastercolumn, -9), 'dd-mon-yy', 'nls_date_language=english');

3 rows updated.

结果:

SQL> select * From test;

MASTERCOLUMN                   PRODUCT_NA SHIPMENTDA
------------------------------ ---------- ----------
Row1_Prod1_ShipDate_01-Dec-21  Prod1      01.12.2021
Row2_Prod2_ShipDate_03-Dec-21  Prod2      03.12.2021
Row3_Prod3_ShipDate_07-Dec-21  Prod3      07.12.2021

SQL>

但是,正如您已经被告知的那样,您宁愿选择另一种方法,其中之一是 视图:

SQL> create or replace view v_test as
  2    select mastercolumn,
  3           substr(mastercolumn,
  4                  instr(mastercolumn, '_', 1, 1) + 1,
  5                  instr(mastercolumn, '_', 1, 2) - instr(mastercolumn, '_', 1,1 ) - 1
  6                  ) as product_name,
  7           to_date(substr(mastercolumn, -9), 'dd-mon-yy', 'nls_date_language=english')
  8             as shipmentdate
  9  from test;

View created.

SQL> select * From v_test;

MASTERCOLUMN                   PRODUCT_NAME         SHIPMENTDA
------------------------------ -------------------- ----------
Row1_Prod1_ShipDate_01-Dec-21  Prod1                01.12.2021
Row2_Prod2_ShipDate_03-Dec-21  Prod2                03.12.2021
Row3_Prod3_ShipDate_07-Dec-21  Prod3                07.12.2021

SQL>