如何从同一 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>
我有一个只有 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>