sql - 更改参考数据库表的输入值
问题描述
它有点复杂,但我试图解释它..我在数据库中有一个表,看起来像这样。这是partno表
... | Part No | Convert | ...
... | 00000 | ABC | ...
... | 00001 | DEF | ...
所有输入值必须以 00000 或 00001 开头,例如 = 0000012345、000014321。
然后,基于这前 5 个值(00000 和 00001),它将被转换为像转换列一样。
例子:
输入:0000012345
预期:ABC12345
输入:000014321
预期:DEF4321
这意味着我必须根据上表转换我得到的输入,但我不知道该怎么做。所以,我作弊并像这样进行查询:
Insert into pencil (pencil_no,lastdate)
values('ABC'|| SUBSTR('" + pen + "',1,2), sysdate)
//pen is the input value
它在我得到我想要的输出时起作用。但不幸的是,这不是正确的方法,因为表中的数据会更新和更改。
谁能指导我如何做到这一点?提前致谢
更新:我遵循以下答案中的指南,如下所示:
insert into pencil(pencil_no, lastdate)
select c.convert || substr('"+ pen + "', 22, 11), sysdate
from partnotable c
where c.PART_NO = substr('" + pen + "', 1, 15)
我设法将它插入到我的数据库中。不幸的是,有一个错误,即试图插入重复键的 UPDATE 或 INSERT 语句。对于在 DBMS MAC 模式下配置的 Trusted Oracle,如果在不同级别存在重复条目,您可能会看到此消息。我相信我输入的输入与表中的任何数据都不重复。当我运行查询时,插入了一行,我可以在我的数据库中查看它,但是当我运行程序时,输出不显示。
我尝试通过添加增量来遵循此方法http://www.lifeaftercoffee.com/2006/02/17/how-to-create-auto-increment-columns-in-oracle/但仍然失败。
解决方案
您的插入语句需要包含转换表的查找,我将在插图中将其称为 CONVERT_TABLE。
您需要引用输入值两次,一次用于查找,一次用于插入值。我在这里使用 SQL*Plus 替换变量;您将需要调整语法以适应您正在运行的 SQL。您还需要使用正确的连接运算符,这在 Oracle 中||
不是+
.
insert into pencil (pencil_no,lastdate)
select c.convert || substr('&&input_value',6), sysdate
from convert_table c
where c.part_no = substr('&&input_value',1, 5)
这是一个糟糕的数据模型。一列代表两件事,在这种情况下,一个 PART_NO 和一个(?)序列号违反了第一范式。结果是棘手的 SQL,通常在从表中选择时,有时在插入或更新时就像这里一样。正确的模型将为表中的每个键组成部分定义单独的列,并使用复合主键或唯一键。如果您需要 PENCIL 列的串联版本,您可以使用虚拟列在查询中显示它。
推荐阅读
- vue.js - Vue中的迷你枢轴网格,没有外部库
- python - 如何在相当平衡的二元分类中解决非常高的误报率?
- angular - 在组件之间共享变量 angular
- sockets - 将 select 与多个套接字一起使用
- php - debian 9 上的 php-pdftk 权限问题
- c++ - “delay()”函数不起作用在 Dev cpp 中不起作用
- r - 一个具有相同比例 tmap 的图例
- linux - Linux读取日志文件并过滤以仅获取一次相同类型的日志消息
- character-encoding - 在 Classic Dyalog APL 字符集中查找字符
- arduino - Arduino 仅在重置后工作