我有一个名为“报告”的表格,其中包含报告ID及其各自的扩展代码。目前,作为示例,每个ID的唯一扩展是“TXT”。我正在尝试在每个现有报告ID中插入新扩展名('RTF')。这是我的代码:
merge into report a
using (select x.rpt_id as value1, 'RTF' as value2
from report x
where x.extension <> 'RTF') b
on (a.rpt_id = b.value1)
when not matched then
insert values (b.value1, b.value2);
我没有错误,但没有插入任何内容......
答案 0 :(得分:2)
在运行语句(当然只是一个示例)和运行语句后所需的数据之前发布数据样本会很有帮助。
听起来你正在寻找像
这样的东西INSERT INTO report( rpt_id, extension )
SELECT rpt_id, 'RTF'
FROM report
WHERE extension != 'RTF'
如果主键实际上是rpt_id
和extension
组合的复合约束,那么您的目标是将N个报表的表格分别扩展为TXT
和使用相同的rpt_id
和扩展名为“RTF”创建N个新行,这将起作用。
SQL> create table report(
2 rpt_id number,
3 extension varchar2(3),
4 constraint extension_pk primary key( rpt_id, extension )
5 );
Table created.
SQL> insert into report values( 1, 'TXT' );
1 row created.
SQL> insert into report values( 2, 'TXT' );
1 row created.
SQL> insert into report values( 3, 'TXT' );
1 row created.
SQL> insert into report values( 4, 'TXT' );
1 row created.
SQL> insert into report values( 5, 'TXT' );
1 row created.
SQL> select * from report;
RPT_ID EXT
---------- ---
1 TXT
2 TXT
3 TXT
4 TXT
5 TXT
SQL> insert into report( rpt_id, extension )
2 select rpt_id, 'RTF'
3 from report
4 where extension != 'RTF';
5 rows created.
SQL> select * from report;
RPT_ID EXT
---------- ---
1 RTF
1 TXT
2 RTF
2 TXT
3 RTF
3 TXT
4 RTF
4 TXT
5 RTF
5 TXT
10 rows selected.
根据您所获得的错误,肯定会出现主要密钥未在rpt_id
和extension
的组合上定义。