SQL:如何避免复制+;粘贴相同的代码?只写一次代码,以后再调用?

SQL:如何避免复制+;粘贴相同的代码?只写一次代码,以后再调用?,sql,oracle,oracle10g,Sql,Oracle,Oracle10g,我有一个很长的SQL脚本。非常难看的是,我多次被迫复制和粘贴现有代码。我更愿意参考现有的代码 我的目标是只编写每个代码块一次。如果我需要第二次,我会引用它。没有视图,这是可能的吗 SELECT batch FROM (SELECT 'DISCONNECT ent_user FROM job_code WITH user_id ="' || a.user_id || '" , jc_name = "' || b.

我有一个很长的SQL脚本。非常难看的是,我多次被迫复制和粘贴现有代码。我更愿意参考现有的代码

我的目标是只编写每个代码块一次。如果我需要第二次,我会引用它。没有视图,这是可能的吗

SELECT batch
FROM (SELECT    'DISCONNECT ent_user  FROM job_code WITH user_id ="'
             || a.user_id
             || '" , jc_name = "'
             || b.jc_name
             || '";'
                AS batch,
             1 AS my_order
        FROM ent_user a, user_jc b
       WHERE a.user_id IN (SELECT user_id
                           FROM (SELECT REPLACE (overview.entity_key,
                                                 'user_id=',
                                                 '')
                                           AS USER_ID,
                                        details.old_value_str,
                                        SUBSTR (
                                           details.old_value_str,
                                           1,
                                           INSTR (details.old_value_str,
                                                  '-',
                                                  1,
                                                  1)
                                           - 1)
                                           AS OLD_PREFIX,
                                        details.new_value_str,
                                        SUBSTR (
                                           details.new_value_str,
                                           1,
                                           INSTR (details.new_value_str,
                                                  '-',
                                                  1,
                                                  1)
                                           - 1)
                                           AS NEW_PREFIX,
                                        overview.from_event_time,
                                        CASE
                                           WHEN SUBSTR (
                                                   details.old_value_str,
                                                   1,
                                                   INSTR (
                                                      details.old_value_str,
                                                      '-',
                                                      1,
                                                      1)
                                                   - 1) =
                                                   SUBSTR (
                                                      details.new_value_str,
                                                      1,
                                                      INSTR (
                                                         details.
                                                          new_value_str,
                                                         '-',
                                                         1,
                                                         1)
                                                      - 1)
                                           THEN
                                              'OK'
                                           ELSE
                                              'DELETE'
                                        END
                                           AS COMPARE
                                   FROM    audit_trail overview
                                        INNER JOIN
                                           audit_info details
                                        ON overview.serial = details.serial
                                  WHERE TO_CHAR (SYSDATE, 'IW-YYYY') =
                                           TO_CHAR (
                                              overview.from_event_time,
                                              'IW-YYYY')
                                        AND details.field_name =
                                               '__99__Department'
                                        AND overview.action = 'Update'
                                        AND CASE
                                               WHEN SUBSTR (
                                                       details.
                                                        old_value_str,
                                                       1,
                                                       INSTR (
                                                          details.
                                                           old_value_str,
                                                          '-',
                                                          1,
                                                          1)
                                                       - 1) =
                                                       SUBSTR (
                                                          details.
                                                           new_value_str,
                                                          1,
                                                          INSTR (
                                                             details.
                                                              new_value_str,
                                                             '-',
                                                             1,
                                                             1)
                                                          - 1)
                                               THEN
                                                  'OK'
                                               ELSE
                                                  'DELETE'
                                            END = 'DELETE'
                                        AND REPLACE (overview.entity_key,
                                                     'user_id=',
                                                     '') NOT LIKE
                                               'EXT%'
                                        AND details.old_value_str LIKE
                                               'INT%'
                                        AND details.new_value_str NOT LIKE
                                               'INT%'))
             AND a.user_id = b.user_id
      UNION
      SELECT 'DISCONNECT rss_user  FROM user_group WITH rss_user_name = "'
             || b.rss_user_name
             || '"  rss_name = "'
             || b.rss_name
             || '" rss_type = "'
             || b.rss_type
             || '" , ug_name = "'
             || b.ug_name
             || '";'
                AS batch,
             2 AS my_order
        FROM ent_user a, ru_ug b
       WHERE a.user_id IN (SELECT user_id
                           FROM (SELECT REPLACE (overview.entity_key,
                                                 'user_id=',
                                                 '')
                                           AS USER_ID,
                                        details.old_value_str,
                                        SUBSTR (
                                           details.old_value_str,
                                           1,
                                           INSTR (
                                              details.old_value_str,
                                              '-',
                                              1,
                                              1)
                                           - 1)
                                           AS OLD_PREFIX,
                                        details.new_value_str,
                                        SUBSTR (
                                           details.new_value_str,
                                           1,
                                           INSTR (
                                              details.new_value_str,
                                              '-',
                                              1,
                                              1)
                                           - 1)
                                           AS NEW_PREFIX,
                                        overview.from_event_time,
                                        CASE
                                           WHEN SUBSTR (
                                                   details.
                                                    old_value_str,
                                                   1,
                                                   INSTR (
                                                      details.
                                                       old_value_str,
                                                      '-',
                                                      1,
                                                      1)
                                                   - 1) =
                                                   SUBSTR (
                                                      details.
                                                       new_value_str,
                                                      1,
                                                      INSTR (
                                                         details.
                                                          new_value_str,
                                                         '-',
                                                         1,
                                                         1)
                                                      - 1)
                                           THEN
                                              'OK'
                                           ELSE
                                              'DELETE'
                                        END
                                           AS COMPARE
                                   FROM    audit_trail overview
                                        INNER JOIN
                                           audit_info details
                                        ON overview.serial =
                                              details.serial
                                  WHERE TO_CHAR (SYSDATE, 'IW-YYYY') =
                                           TO_CHAR (
                                              overview.from_event_time,
                                              'IW-YYYY')
                                        AND details.field_name =
                                               '__99__Department'
                                        AND overview.action = 'Update'
                                        AND CASE
                                               WHEN SUBSTR (
                                                       details.
                                                        old_value_str,
                                                       1,
                                                       INSTR (
                                                          details.
                                                           old_value_str,
                                                          '-',
                                                          1,
                                                          1)
                                                       - 1) =
                                                       SUBSTR (
                                                          details.
                                                           new_value_str,
                                                          1,
                                                          INSTR (
                                                             details.
                                                              new_value_str,
                                                             '-',
                                                             1,
                                                             1)
                                                          - 1)
                                               THEN
                                                  'OK'
                                               ELSE
                                                  'DELETE'
                                            END = 'DELETE'
                                        AND REPLACE (
                                               overview.entity_key,
                                               'user_id=',
                                               '') NOT LIKE
                                               'EXT%'
                                        AND details.old_value_str LIKE
                                               'INT%'
                                        AND details.new_value_str NOT LIKE
                                               'INT%'))
             AND a.user_id = b.user_id
             AND (   b.rss_type = 'TEST14'
                  OR b.rss_type = 'TTTR'
                  OR b.rss_type = 'OFFI2021'
                  OR b.rss_type = 'TEST27'
                  OR b.rss_type = 'TEST22'
                  OR b.rss_type = 'TEST26'
                  OR b.rss_type = 'TEST23'
                  OR b.rss_type = 'TEST39'
                  OR b.rss_type = 'TEST19'
                  OR b.rss_type = 'TEST12'
                  OR b.rss_type = 'TEST16'
                  OR b.rss_type = 'TEST05'
                  OR b.rss_type = 'TEST09'
                  OR b.rss_type = 'HSSO'
                  OR b.rss_type = 'TEST37'
                  OR b.rss_type = 'TEST34'
                  OR b.rss_type = 'TEST1')
      UNION
      SELECT    'DELETE rss_user WITH rss_user_name = "'
             || b.rss_user_name
             || '"  rss_name = "'
             || b.rss_name
             || '" rss_type = "'
             || b.rss_type
             || '";'
                AS batch,
             3 AS my_order
        FROM ent_user a, rss_user b
       WHERE a.user_id IN (SELECT user_id
                           FROM (SELECT REPLACE (overview.entity_key,
                                                 'user_id=',
                                                 '')
                                           AS USER_ID,
                                        details.old_value_str,
                                        SUBSTR (
                                           details.old_value_str,
                                           1,
                                           INSTR (
                                              details.old_value_str,
                                              '-',
                                              1,
                                              1)
                                           - 1)
                                           AS OLD_PREFIX,
                                        details.new_value_str,
                                        SUBSTR (
                                           details.new_value_str,
                                           1,
                                           INSTR (
                                              details.new_value_str,
                                              '-',
                                              1,
                                              1)
                                           - 1)
                                           AS NEW_PREFIX,
                                        overview.from_event_time,
                                        CASE
                                           WHEN SUBSTR (
                                                   details.
                                                    old_value_str,
                                                   1,
                                                   INSTR (
                                                      details.
                                                       old_value_str,
                                                      '-',
                                                      1,
                                                      1)
                                                   - 1) =
                                                   SUBSTR (
                                                      details.
                                                       new_value_str,
                                                      1,
                                                      INSTR (
                                                         details.
                                                          new_value_str,
                                                         '-',
                                                         1,
                                                         1)
                                                      - 1)
                                           THEN
                                              'OK'
                                           ELSE
                                              'DELETE'
                                        END
                                           AS COMPARE
                                   FROM    audit_trail overview
                                        INNER JOIN
                                           audit_info details
                                        ON overview.serial =
                                              details.serial
                                  WHERE TO_CHAR (SYSDATE, 'IW-YYYY') =
                                           TO_CHAR (
                                              overview.from_event_time,
                                              'IW-YYYY')
                                        AND details.field_name =
                                               '__99__Department'
                                        AND overview.action = 'Update'
                                        AND CASE
                                               WHEN SUBSTR (
                                                       details.
                                                        old_value_str,
                                                       1,
                                                       INSTR (
                                                          details.
                                                           old_value_str,
                                                          '-',
                                                          1,
                                                          1)
                                                       - 1) =
                                                       SUBSTR (
                                                          details.
                                                           new_value_str,
                                                          1,
                                                          INSTR (
                                                             details.
                                                              new_value_str,
                                                             '-',
                                                             1,
                                                             1)
                                                          - 1)
                                               THEN
                                                  'OK'
                                               ELSE
                                                  'DELETE'
                                            END = 'DELETE'
                                        AND REPLACE (
                                               overview.entity_key,
                                               'user_id=',
                                               '') NOT LIKE
                                               'EXT%'
                                        AND details.old_value_str LIKE
                                               'INT%'
                                        AND details.new_value_str NOT LIKE
                                               'INT%'))
             AND a.user_id = b.user_id
             AND (   b.rss_type = 'TEST14'
                  OR b.rss_type = 'TEST27'
                  OR b.rss_type = 'TEST22'
                  OR b.rss_type = 'TEST26'
                  OR b.rss_type = 'TEST23'
                  OR b.rss_type = 'TEST39'
                  OR b.rss_type = 'TEST19'
                  OR b.rss_type = 'TEST12'
                  OR b.rss_type = 'TEST16'
                  OR b.rss_type = 'TEST09'
                  OR b.rss_type = 'TEST05'
                  OR b.rss_type = 'TEST37'
                  OR b.rss_type = 'TEST34'
                  OR b.rss_type = 'TEST1')
          ORDER BY my_order;
您能在没有重复代码的情况下重写查询吗?

创建一个类似

create view details
as
select d.*, 
       substr(d.old_value_str, 1, instr(details.old_value_str, '-', 1, 1) - 1) as old_prefix, 
       substr(d.new_value_str, 1, instr(details.new_value_str, '-', 1, 1) - 1) as new_prefix,
       case
         when substr (d.old_value_str, 1, instr (d.old_value_str, '-', 1, 1) - 1)
               = substr (d.new_value_str, 1, instr (d.new_value_str, '-', 1, 1) - 1)
         then
           'OK'
         else
           'DELETE'
       end as compare
  from audit_info d;
(或在
with子句中使用该选项,而不是在视图中使用该选项)

那就这样引用吧

   WHERE a.user_id IN (SELECT user_id
                       FROM (SELECT REPLACE (overview.entity_key,
                                             'user_id=',
                                             '')
                                       AS USER_ID,
                                    details.old_value_str,
                                    OLD_PREFIX,
                                    details.new_value_str,
                                    NEW_PREFIX,
                                    overview.from_event_time,
                                    COMPARE
                               FROM    audit_trail overview
                                    INNER JOIN  details
                                    ON overview.serial = details.serial
                              WHERE TO_CHAR (SYSDATE, 'IW-YYYY') =
                                       TO_CHAR (
                                          overview.from_event_time,
                                          'IW-YYYY')
                                    AND details.field_name =
                                           '__99__Department'
                                    AND overview.action = 'Update'
                                    AND CASE
                                           WHEN old_prefix =
                                                   new_prefix
                                           THEN
                                              'OK'
                                           ELSE

etc..

编写过程或函数…您可以尝试使用视图或常用表表达式