【发布时间】:2013-04-12 12:18:42
【问题描述】:
我有一个 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'
【问题讨论】:
-
你的目标是什么:使用动态 sql,例如相同的 sql 但不同。表还是像 Florin 的示例那样重写查询?
-
@fyodor78 第一个解决方案并不总是最好的。当然,您可以在选择之前加入表 - 但是当您想从每个表中检索一行时,为什么要构建一个 100.000 行的临时表?请参阅动态 SQL,创建一个过程,构建一个查询字符串并重用该过程。
标签: sql oracle oracle10g union-all