sql - 在过程中重用 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,因为它似乎更接近现有语法。但也许将选择加载到临时/私有/实际表中的功能只是更好的方法。
谢谢大家!
解决方案
如果您正在寻找一个纯 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,然后在需要时使用它,而不会在每个会话结束时删除。找到更多。
推荐阅读
- java - 使用 WSDL 生成的类的单元测试中的 java.lang.ExceptionInInitializerError
- java - RecylerView 不会更新新数据,除非模拟器通过打开和关闭来刷新
- javascript - REACT: Translator Component | Setting & Accessing State
- python - Google Assistant on rgb matrix with Raspberry Pi
- java - 只有在用户选择的情况下,我如何才能使我的扣除有效?
- android - 如何在 APK 文件中找到启动路径?
- javascript - 这是处理 JavaScript 承诺的正确方法吗?
- angular - 测试套件未能运行,Jest 遇到了意外的令牌
- plot - 在同一窗口中的gnuplot中循环绘图
- c# - 多个对话框的全局用户配置文件状态