首页 > 解决方案 > 在过程中重用 Select 语句

问题描述

我喜欢做类似的事情

create tmp_table as ( select 1 some_value, 2 some_other_value from dual union select 3 some_value, 4 some_other_value from dual );

insert into table1 (field1) select some_value from tmp_table;

update table2 set field2 = 5 where field1 in ( select some_value from tmp_table );

drop tmp_table;

有没有更好的方法呢?也许是 WITH 语句的迭代使用?

with tmp_statement as (select ...) ( insert... update ... )

编辑:

嗨,很抱歉这个非常笼统的问题。基本上,我想通过拆分操作但保持“仅选择一个”规则有效来改进一些公司语法(选择..循环...在这里慢慢地逐行执行),因为选择将是广泛的,而您无论如何只想编辑一个选择。我尝试使用 with,因为它似乎更接近现有语法。但也许将选择加载到临时/私有/实际表中的功能只是更好的方法。

谢谢大家!

标签: sqloraclewith-statement

解决方案


如果您正在寻找一个纯 SQL 解决方案来跨多个语句引用一个值,请使用替换变量(适用于 SQL*Plus、SQL Developer、sqlcl 和任何其他支持 SQL*Plus 命令的环境):

ACCEPT some_value PROMPT "Please enter a value for SOME_VALUE:"

insert into table1 (field1) select '&&some_value' from dual;

update table2 set field2 = 5 where field1 in ('&&some_value' );

但是,您使用基于集合的操作表明您期望 TMP_TABLE 可能包含多行。在这种情况下,上述方法不起作用。如果是这种情况,请编辑您的问题以提供有关您要实现的目标的更多详细信息。

对此有多种解决方案,包括 PL/SQL 集合或跨执行保留 TMP_TABLE。这取决于你想多久做一次这件事。

创建和删除 TMP_TABLE 等对象的反模式在具有 T-SQL 背景的开发人员中很常见。Oracle 在几个方面与 SQL Server 不同,这就是其中之一:它不赞成动态执行 DDL,作为某些事务逻辑的一部分。

您可能需要的方法是将 TMP_TABLE 创建为 GLOBAL TEMPORARY TABLE。这是一个永久的数据结构,但它的数据在事务(或会话)结束时被丢弃。如果您选择这种方法,您将创建一次 TMP_TABLE,然后在需要时使用它,而不会在每个会话结束时删除。找到更多。


推荐阅读