我的SQL查询具有完全相同的代码,但有两个不同的表(AUDIT_TRAIL_ARCHIVE和AUDIT_TRAIL)。我使用“UNION ALL”得到一个结果。
优秀的程序员使用"Don't repeat yourself"原则。优秀的程序员避免WET(写两次)。
如何用“不要重复自己”的原则重写这段代码?
SELECT REPLACE (ENTITY_KEY, 'rss_user_name=CN=', '')
FROM AUDIT_TRAIL_ARCHIVE AU
INNER JOIN
(SELECT RSS_USER_NAME
FROM RSS_USER
WHERE RSS_NAME = 'rmad'
AND ADD_INFO_MASTER LIKE '%__47__UPN=%@richemont.com%') FALSCH
ON REPLACE (AU.ENTITY_KEY, 'rss_user_name=CN=', '') =
FALSCH.RSS_USER_NAME
WHERE AU.RSS_NAME = 'rmad'
AND AU.TABLE_NAME = 'rss_user'
AND AU.ACTION = 'Insert'
AND AU.ENTITY_KEY LIKE 'rss_user_name=CN=%'
AND AU.ORIGIN != 'RSS'
UNION ALL
SELECT REPLACE (ENTITY_KEY, 'rss_user_name=CN=', '')
FROM AUDIT_TRAIL AU
INNER JOIN
(SELECT RSS_USER_NAME
FROM RSS_USER
WHERE RSS_NAME = 'rmad'
AND ADD_INFO_MASTER LIKE '%__47__UPN=%@richemont.com%') FALSCH
ON REPLACE (AU.ENTITY_KEY, 'rss_user_name=CN=', '') =
FALSCH.RSS_USER_NAME
WHERE AU.RSS_NAME = 'rmad'
AND AU.TABLE_NAME = 'rss_user'
AND AU.ACTION = 'Insert'
AND AU.ENTITY_KEY LIKE 'rss_user_name=CN=%'
AND AU.ORIGIN != 'RSS'
答案 0 :(得分:5)
例如:
SELECT REPLACE (ENTITY_KEY, 'rss_user_name=CN=', '')
FROM (select * --or relevant columns
from AUDIT_TRAIL_ARCHIVE AU
union all
select *
from AUDIT_TRAIL AU
) AU
INNER JOIN
(SELECT RSS_USER_NAME
FROM RSS_USER
WHERE RSS_NAME = 'rmad'
AND ADD_INFO_MASTER LIKE '%__47__UPN=%@richemont.com%') FALSCH
ON REPLACE (AU.ENTITY_KEY, 'rss_user_name=CN=', '') =
FALSCH.RSS_USER_NAME
WHERE AU.RSS_NAME = 'rmad'
AND AU.TABLE_NAME = 'rss_user'
AND AU.ACTION = 'Insert'
AND AU.ENTITY_KEY LIKE 'rss_user_name=CN=%'
AND AU.ORIGIN != 'RSS'
答案 1 :(得分:0)
优秀的程序员使用“不要重复自己”的原则。优秀的程序员避免WET(写两次)。
嘿。我喜欢。微妙。
另外,我可能过于基本但是会像这样工作:
CREATE [OR REPLACE] PROCEDURE <name_of_procedure> [ (<ENTITY_KEY_variable>) ]
IS
<ENTITY_KEY=ENTITY_KEY_variable>
BEGIN
<your code goes here>
[EXCEPTION
exception_section]
END [procedure_name];
编辑:我从第一个发布的答案中看到我堕落了?傻我。
答案 2 :(得分:0)
简单地说,你不能。 SQL是编译语言(即使它看起来像脚本),Oracle会记住查询所依赖的OBJECT_ID。查询的每一半都有不同的依赖关系,不同的“字节码”和不同的执行计划。
你可以
使用表空间分区。那你就只有一张桌子。可以使用“select * from AUDIT_TRAIL partition ACTIVE”来限制对实时数据的查询。
使用像
这样的查询分解WITH AU AS
(SELECT * from AUDIT_TRAIL union all select * from AUDIT_TRAIL_ARCHIVE)
SELECT REPLACE (ENTITY_KEY, 'rss_user_name=CN=', '')
FROM AU JOIN ...
...
但是我不确定在这种情况下Oracle是否会保证执行计划的效率相同。