尝试更新包含聚合函数(计数)的选择案例语句时出错

Posted

技术标签:

【中文标题】尝试更新包含聚合函数(计数)的选择案例语句时出错【英文标题】:Error when trying to update a select case statement that contains an aggregate function (count) 【发布时间】:2014-10-06 20:45:54 【问题描述】:

目的: 我想根据列的文本和列出的每个 item_number 的文本计数来验证单个列中的文本是否属于特定类别(item_numbers 预计会被列出不止一次,其中包含 4 行(计数),带有 'textA' 和 2 行(count) with 'textB')。

但是,如果 item_number 不符合特定类别,那么我希望返回一条消息,指出存在差异。

当前结果: 我收到此错误消息:SQL 错误:ORA-00933:SQL 命令未正确结束

脚本:

UPDATE TableA
 SET TableA.Column1 = T.Count
 from TableA JOIN (
   select TableA.item_1,TableA.object_2,
     case
     when count(object_2) !=4 and dobject_2 = 'textA'
     then 'ERROR_A'
     WHEN COUNT(object_2) !=2 AND object_2 = 'textB'
     ELSE 'ERROR_B'
     END AS Count
  from TableA 
  JOIN ac on (TableA.item_1 = ac.item_1 and TableA.object_2 = ac.object_2)
  where ac.object_3 in ('textC','textD',null)
  group by TableA.item_1,TableA.object_2
  )T on TableA.item_1 = t.item_1 and TableA.object_2 = t.object_2;

【问题讨论】:

Oracle 不支持update 语句中的join。另外,我正在删除“mysql”标签,因为错误消息来自 Oracle。 【参考方案1】:

您的查询有很多问题,但我认为这可能是您正在寻找或接近的:

update tablea a
    set column1 = (select (case when count(object_2) <> 4 and object_2 = 'textA'
                                then 'ERROR_A'
                                when COUNT(object_2) <> 2 and object_2 = 'textB'
                                then 'ERROR_B'
                           end)
                   from ac
                   where TableA.item_1 = ac.item_1 and TableA.object_2 = ac.object_2 and
                         (ac.object_3 in ('textC', 'textD') or ac.object_3 is null)
                   group by object_2
                  );

除了明显的语法问题(因为Oracle不支持update中的join),还有:

case 语句缺少then 子句(我将else 更改为then)。 in 列表中的NULL 是荒谬的;它什么也没做,所以我添加了一个单独的检查。 SQL 使用&lt;&gt; 表示“不等于”,尽管许多数据库确实支持!=

【讨论】:

感谢您的更新。但是,该脚本不起作用。为了澄清“AC”不是一个表,它是一个别名。 TableA 是唯一使用的表。请指教。 @tcc 。 . . join ac。在您的原始查询中,ac 是一个表或视图。 @Gordon...我从 Stack 上的一个示例中获得了 join 语句。它不能正常工作。实际上我只使用 1 个表来得出结果。 ac 可以删除它不是一个实际的表。 UPDATE TableA SET TableA.Column1 = T.Count from TableA JOIN (select TableA.item_1,TableA.object_2, case when count(object_2) !=4 and dobject_2 = 'textA' then 'ERROR_A' WHEN COUNT(object_2) !=2 AND object_2 = 'textB' ELSE 'ERROR_B' END AS 从 TableA 计数 JOIN TableA on (TableA.item_1 = TableA.item_1 and TableA.object_2 = TableA.object_2) where TableA.object_3 in (' textC','textD',null) 按 TableA.item_1,TableA.object_2 )T 在 TableA.item_1 = t.item_1 和 TableA.object_2 = t.object_2 上分组;

以上是关于尝试更新包含聚合函数(计数)的选择案例语句时出错的主要内容,如果未能解决你的问题,请参考以下文章

DB2 - 在光标中聚合大小写

访问更新查询:查询不包含指定表达式作为聚合函数的一部分

sql - 使用聚合函数(最小值/最大值)作为选择语句的一部分

Hive 在使用 case 语句和聚合时按列分组出错

SQL语句汇总(三)——聚合函数分组子查询及组合查询 - Darly

UIImagePickerController 抛出错误:185:创建聚合音频设备时出错:尝试选择视频时出现“啥”