Oracle SQL 中的插入选择查询缺少表达式错误

Posted

技术标签:

【中文标题】Oracle SQL 中的插入选择查询缺少表达式错误【英文标题】:Missing expression Error with Insert Select query in Oracle SQL 【发布时间】:2021-10-22 23:18:35 【问题描述】:

我在使用插入选择查询的 Oracle SQL 时遇到了这个错误,但不知道错误来自哪里 SQL 查询是:

insert into GroupScenarioAction (ID, ID_UUID, GPSCENARIO_UUID, ACTION, VERSION)
(select DEFAULT , '0', ACTION.ID_UUID, '5310AFAA......', '1', ACTION_ID, '0'
from ACTION where ACTION.id not in (select ACTION FROM GroupScenarioAction where 
GPSCENARIO = '1'));

错误是 ORA-00936:缺少表达式位置 129

【问题讨论】:

通常是INSERT .... SELECT ...; 而不是INSERT ... (SELECT ...); 我试过@JonArmstrong 计算插入列列表中的列数和 SELECT 列表中的值数......在你的问题中。不是你的照片。提供CREATE TABLE 语句。 虽然您发布的问题有拼写错误/错误,但我认为问题在于您使用了DEFAULT。而不是使用DEFAULT,只需从插入列表中删除该列并从选择列表中删除DEFAULT 术语,如下所示:dbfiddle.uk/… 我无法复制粘贴代码,它们在另一台机器上,我使用 vm 进行编码。但我添加了一些图片以获取更多详细信息。 @jonArmstrong 【参考方案1】:

很难提供帮助,因为

您将相关数据发布为 图像(为什么您希望我们输入所有这些以便我们可以尝试?)而不是 代码(很容易复制/粘贴后使用) 您发布的代码(insert 语句本身)使用的列在您发布的描述的任何表中都不存在 例如,insert 插入到GroupScenarioAction,但那里没有这样的表;也许是goroohscenarioaction?或者,action 表中没有 action_id 列 您正在将值插入 5 列,但 select 语句包含 7 列;引发ORA-00913: too many values 错误,您甚至不会遇到 missing expression 错误

很快,好像您竭尽全力阻止我们帮助您。


你发布的一个 cmets 说

这是主键,那么这些值应该来自哪里?

这是default 中的关键字

insert into GroupScenarioAction (ID, ...)
   (select DEFAULT, ...
           -------
           this

看起来ID 列是作为标识列创建的,其值是自动生成的(即 Oracle 会处理它),这也意味着您使用的是 Oracle 12c 或更高版本(在较低版本中没有这样的选项版本)。另一方面,create table goroohscenarioaction 声明并没有暗示类似的东西。


无论如何:如果你这样做正确,它会起作用。我创建了两个带有最小列集的示例表,只是为了使insert 工作。另外,因为我在 11gXE 上(它不支持标识列,所以我插入了一个序列值,基本上,无论如何,标识列在后台使用 ):

SQL> create table groupscenarioaction
  2    (id              number,
  3     id_uuid         raw(255),
  4     gpscenario_uuid raw(255),
  5     action          number,
  6     version         number
  7    );

Table created.

SQL> create table action
  2    (id_uuid  raw(255),
  3     id       number
  4    );

Table created.

SQL> create sequence seq;

Sequence created.

插入您发布的内容;我注释掉了不存在或多余的列。它工作;虽然,没有插入任何东西,因为我的表是空的,但它不会引发任何错误:

SQL> insert into GroupScenarioAction
  2    (ID, ID_UUID, GPSCENARIO_UUID, ACTION, VERSION)
  3    (select 1 /*DEFAULT*/ , '0', ACTION.ID_UUID, '5310AFAA......', '1' --, id /*ACTION_ID*/, '0'
  4     from ACTION
  5     where ACTION.id not in (select ACTION FROM GroupScenarioAction
  6                             where  gpscenario_uuid/*GPSCENARIO*/ = '1'));

0 rows created.

美化:

SQL> insert into groupscenarioaction
  2    (id, id_uuid, gpscenario_uuid, action, version)
  3    (select seq.nextval, '0', a.id_uuid, '5310AFAA......', '1'
  4     from action a
  5     where a.id not in (select g.action
  6                        from groupscenarioaction g
  7                        where g.gpscenario_uuid = '1'));

0 rows created.

SQL>

现在您已经了解了更多关于哪些问题可以帮助您,如果我写的内容还不够,请考虑编辑您发布的原始问题(只需删除所有错误的内容并写一些真实的内容,我们可以使用)。

【讨论】:

感谢您写下代码。我会尽快编辑这篇文章

以上是关于Oracle SQL 中的插入选择查询缺少表达式错误的主要内容,如果未能解决你的问题,请参考以下文章

带有 ORA-00936 的 SQL 查询实例:缺少表达式错误

选择 id 为偶数的行

Oracle SQL:带有 REGEXP_SUBSTR 表达式的插入查询很长(拆分字符串)

从一个表中选择,插入另一个表 oracle sql 查询

CASE .. Oracle SQL 中的 WHEN 表达式

Oracle PL/SQL 查询无法编译