【问题标题】:Select sub queries within a select在选择中选择子查询
【发布时间】:2018-08-13 17:06:35
【问题描述】:
insert into time_test(Difference) values 
(select ((select actual from time_test where id = :p13_id)  - 
(select 
(monday+tuesday+wednesday+thursday+friday) from time_test where id= 
:p13_id 
)) from time_test where id= :p13_id)

Differencetime_test 中为空的列,:p13_id 是 Oracle Apex 的页面项。

我知道我需要将它包装在 nvl 或类似的函数中,但我不知道如何。

【问题讨论】:

  • 为什么要使用子查询?该值实际上是空的,还是没有匹配的行?您实际上是在正在查询的同一个表中插入一个新行 - 插入语句中只有一列 - 还是您实际上可能试图根据同一行中的其他值更新该列?
  • 既然您质疑我想我正在尝试更新该行。
  • 更新时间_测试集差异 = 实际 - (select(monday+Tuesday+Wednesday+ Thursday+Friday)) where id = :p13_id

标签: sql oracle oracle-apex oracle-apex-5.1


【解决方案1】:

看起来您实际上是在尝试进行更新,而不是插入:

update time_test
set difference = actual - (monday+tuesday+wednesday+thursday+friday)
where id = :p13_id

如果任何 'day' 列可能为空,那么您可以使用 nvl()coalesce() 将它们默认为零,这样它们就不会破坏计算:

update time_test
set difference = actual - coalesce(monday, 0) - coalesce(tuesday, 0)
  - coalesce(wednesday, 0) - coalesce(thursday, 0) - coalesce(friday, 0)
where id = :p13_id

您也可以使用coalesce(actual, 0),但如果未设置,则将差异留空可能更有意义。这取决于你想在这种情况下看到什么。


在这种情况下,nvl()coalesce() 函数是等效的。如果第一个参数 - 例如monday - 为 null 然后替换第二个参数。所以nvl(monday, 0) 会给你monday 的实际值,如果它不为null,但如果它为null,它会给你零。您将从 coalesce() 获得相同的效果,但它允许计算多个表达式的列表,并将返回列表中的第一个非空值。


另一种方法是使difference 成为动态计算的虚拟列,或者在表格的视图中计算它;要么将删除重复的数据存储和自己维护价值的需要。如果您确实想要一个物理列,您可以从触发器中设置它,以便在您的 Apex 应用程序之外更新任何其他列时自动进行维护。但虚拟列可能更简单、更整洁。

【讨论】:

  • 你能解释一下 nv1() 吗?我不完全理解。执行操作时,我已将默认值设置为 0 但如果我有 500 个页面项目,则很难将所有 500 设置为 0 并且如果我不将其设置为 0 。结果是错误的。
  • 我不确定你的意思。 nvl(monday, 0) 将为受更新影响的每一行独立评估 monday 的值;并且对于每一行,如果该行的列值为空,那么它将仅替换为该行的零。无论如何,您似乎一次更新一行。 (不知道您所说的“执行操作我设置了默认值”是什么意思)。
  • 我并不完全知道什么是 nvl 函数。我开始用谷歌搜索它,我明白了。它帮了我很多。由于愚蠢的空值,我无法执行任何操作。我一直认为 null 是 0 而不是没有值,所以我有点忘了它。
猜你喜欢
  • 1970-01-01
  • 2019-04-04
  • 2021-07-23
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-08-12
  • 2012-02-13
  • 2014-06-08
相关资源
最近更新 更多