0

全体的なタスク :- システム A の 45 フィールドからデータを取得し、そのデータを一時テーブルにダンプする必要があります。このデータは、システム B にインポートする xml データ ファイルを生成する UNIX プロセスによって取得されます。

具体的な質問: 45 個のフィールドに書き込まれるデータを取得する最善の方法は何ですか? データの大部分は独立しており、単一のステートメントを使用して取得することはできません。現在、このデータを取得する方法は次のとおりです(以下の例)

私の一時テーブルには、データを抽出する必要がある影響を受けるプロパティ ID が保持されています。つまり、PROP_LIST_TEMP と ASSOC_PROP_TEMP です。

    SELECT SUBSTR (pro.pro_propref, 1, 25)                                  UPRN,
(SELECT SUBSTR (adr_building, 1, 100)
               FROM addresses, address_usages
              WHERE     aus_adr_refno = adr_refno
                    AND aus_aut_far_code = 'PHYSICAL'
                    AND aus_aut_fao_code = 'PRO'
                    AND (aus_end_date IS NULL OR aus_end_date > SYSDATE)
                    AND aus_pro_refno = pro.pro_refno)
                                                                                 BUILDING_NAME,          
               (SELECT CASE
                        WHEN (adr_street_number like 'BLOC%' 
                              OR adr_street_number like '%-%'
                              OR adr_street_number like '%/%')
                        THEN NULL
                        ELSE regexp_replace (adr_street_number, '[^[:digit:]]+')
                        END
                  FROM addresses, address_usages
                  WHERE aus_adr_refno = adr_refno
                    AND aus_aut_far_code = 'PHYSICAL'
                    AND aus_aut_fao_code = 'PRO'
                    AND (aus_end_date IS NULL OR aus_end_date > SYSDATE)
                    AND aus_pro_refno = pro.pro_refno)
                                                                               STREET_NUMBER,
               (SELECT CASE 
                        WHEN (adr_street_number like 'BLOC%' 
                              OR adr_street_number like '%-%'
                              OR adr_street_number like '%/%')
                        THEN SUBSTR (adr_street_number, 1, 20)
                        ELSE  REGEXP_REPLACE (adr_street_number, '[^[:alpha:]]+', '')
                        END
                  FROM addresses, address_usages
                  WHERE aus_adr_refno = adr_refno
                    AND aus_aut_far_code = 'PHYSICAL'
                    AND aus_aut_fao_code = 'PRO'
                    AND (aus_end_date IS NULL OR aus_end_date > SYSDATE)
                    AND aus_pro_refno = pro.pro_refno)
                                                                                STREET_NUMBER_SUFFIX,
               (SELECT SUBSTR (ptv_pty_code, 1, 3)
                  FROM prop_type_values
                 WHERE ptv_refno = pro.pro_hou_ptv_refno)
                                                                               HOUSE_TYPE
FROM properties pro
         WHERE pro_refno IN (select * from PIMSS_PROP_LIST_TEMP  
                             UNION
                             select * from PIMSS_ASSOC_PROP_TEMP)
         AND  pro.pro_hou_hrv_hot_code IN 
                                       (SELECT frv_code
                                          FROM first_ref_values
                                         WHERE frv_frd_domain IN ('ASS_OWN_REF')
                                           AND frv_current_ind = 'Y');
4

1 に答える 1

0

select ステートメントのサブクエリの where 句は同一であるため、次のように where 句に単純に引き出すことができます。

SELECT SUBSTR (pro.pro_propref, 1, 25) UPRN,
       SUBSTR (addr.adr_building, 1, 100) BUILDING_NAME,          
       CASE WHEN (addr.adr_street_number like 'BLOC%' 
                  OR addr.adr_street_number like '%-%'
                  OR addr.adr_street_number like '%/%')
                 THEN NULL
            ELSE regexp_replace (addr.adr_street_number, '[^[:digit:]]+')
       END STREET_NUMBER,
       CASE WHEN (addr.adr_street_number like 'BLOC%' 
                  OR addr.adr_street_number like '%-%'
                  OR addr.adr_street_number like '%/%')
                 THEN SUBSTR (addr.adr_street_number, 1, 20)
            ELSE  REGEXP_REPLACE (addr.adr_street_number, '[^[:alpha:]]+', '')
       END STREET_NUMBER_SUFFIX,
       (SELECT SUBSTR (ptv_pty_code, 1, 3)
          FROM prop_type_values
         WHERE ptv_refno = pro.pro_hou_ptv_refno) HOUSE_TYPE
FROM   properties pro,
       (select adr_building,
               adr_street_number
        FROM   addresses, address_usages
        WHERE  aus_adr_refno = adr_refno
        AND    aus_aut_far_code = 'PHYSICAL'
        AND    aus_aut_fao_code = 'PRO'
        AND    (aus_end_date IS NULL OR aus_end_date > SYSDATE)) addr
WHERE  pro.pro_refno = aus_pro_refno
and    pro_refno IN (select * from PIMSS_PROP_LIST_TEMP  
                     UNION
                     select * from PIMSS_ASSOC_PROP_TEMP)
AND    pro.pro_hou_hrv_hot_code IN (SELECT frv_code
                                      FROM first_ref_values
                                     WHERE frv_frd_domain IN ('ASS_OWN_REF')
                                       AND frv_current_ind = 'Y');

addr サブクエリから行が返されない可能性がある場合は、外部結合が必要になる可能性があります。

于 2015-01-22T15:28:20.833 に答える