5

我有一个 SQL 查询,其代码完全相同,但有两个不同的表(AUDIT_TRAIL_ARCHIVE 和 AUDIT_TRAIL)。我使用“UNION ALL”得到一个结果。

优秀的程序员使用“不要重复自己”的原则。优秀的程序员会避免 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'
4

3 回答 3

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'
于 2013-04-12T12:23:32.370 回答
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];

编辑:我从第一个发布的答案中看到我爱上了拖钓?傻我。

于 2013-04-12T12:32:13.537 回答
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是否会保证执行计划的相同效率。

于 2013-04-12T12:47:46.297 回答