sql >> データベース >  >> RDS >> Oracle

テーブルSQLにNULL値を与えない左結合

    私が以下のようにリストしたいくつかの問題があります

    1. これをINNER JOINとして使用しました 次のようになりますが、ON 条件は、テーブルの列で構成されます:PAY_PAYROLL_ACTIONS PAY_PAYROLL_ACTIONSに従業員のデータがない場合、条件はfalseになります。 テーブル。

      JOIN PAY_TIME_PERIODS PTP ON ( PPA.EARN_TIME_PERIOD_ID = PTP.TIME_PERIOD_ID )

    2. 次の5つのWHERE条件を使用しました。

      • PPA.ACTION_TYPE IS NULL
      • TO_CHAR(NVL(PPA.EFFECTIVE_DATE, '2019-09-01'), 'YYYY-MM-DD') BETWEEN ( '2019-09-01' ) AND ( '2019-12-01' )
      • PPA.CONSOLIDATION_SET_ID = PCS.CONSOLIDATION_SET_ID
      • NVL(PPA.EFFECTIVE_DATE, TRUNC(SYSDATE)) BETWEEN PAYREL.START_DATE AND PAYREL.END_DATE
      • NVL(PPA.EFFECTIVE_DATE, TRUNC(SYSDATE)) BETWEEN PAPD.START_DATE AND PAPD.END_DATE

    これらの条件は、テーブルPAY_PAYROLL_ACTIONS内のデータの存在に基づく最終結果にも影響します。 。私は、これらの表に関する私の知識に従って、次のように解決策を提供しようとしています(変更の説明についてはインラインコメントを参照してください)。

    SELECT DISTINCT
        PAPF.PERSON_NUMBER,
        NAME.FIRST_NAME,
        NAME.LAST_NAME,
        PAAM.ASSIGNMENT_NUMBER,
        PY.PAYROLL_NAME,
        (
            SELECT
                MEANING
            FROM
                FND_LOOKUP_VALUES
            WHERE
                LOOKUP_TYPE = 'ACTION_TYPE'
                AND LOOKUP_CODE = PPA.ACTION_TYPE
                AND LANGUAGE = 'US'
                AND ENABLED_FLAG = 'Y'
        ) ACTION_TYPE,
        TO_CHAR(PPA.EFFECTIVE_DATE, 'DD-MON-YYYY') EFFECTIVE_DATE,
        PPA.PAYROLL_ACTION_ID   ACTION_NUMBER,
        PCS.CONSOLIDATION_SET_NAME,
        TO_CHAR(FINC, 'DD-MON-YYYY') FINC,
        PASV.USER_STATUS
    FROM
        PAY_ASSIGNED_PAYROLLS_DN PAPD
        JOIN PAY_PAYROLL_TERMS PT ON ( PAPD.PAYROLL_TERM_ID = PT.PAYROLL_TERM_ID )
        JOIN PAY_PAY_RELATIONSHIPS_DN PR ON ( PT.PAYROLL_RELATIONSHIP_ID = PR.PAYROLL_RELATIONSHIP_ID )
        JOIN PAY_ALL_PAYROLLS_F PY ON ( PAPD.PAYROLL_ID = PY.PAYROLL_ID )
        JOIN PER_ALL_PEOPLE_F PAPF ON ( PR.PERSON_ID = PAPF.PERSON_ID )
        JOIN PAY_CONSOLIDATION_SETS PCS ON ( PCS.CONSOLIDATION_SET_ID = PY.CONSOLIDATION_SET_ID )
        JOIN PER_PERSON_NAMES_F NAME ON ( PAPF.PERSON_ID = NAME.PERSON_ID )
        JOIN PAY_REL_GROUPS_DN PAYREL ON ( PAYREL.PARENT_REL_GROUP_ID = PAPD.PAYROLL_TERM_ID )
        JOIN PER_ALL_ASSIGNMENTS_M PAAM ON ( PAYREL.ASSIGNMENT_ID = PAAM.ASSIGNMENT_ID )
        JOIN PAY_PAYROLL_REL_ACTIONS PPRA ON ( PPRA.PAYROLL_RELATIONSHIP_ID = PR.PAYROLL_RELATIONSHIP_ID )
        JOIN PER_ASSIGNMENT_STATUS_TYPES_VL PASV ON ( PASV.ASSIGNMENT_STATUS_TYPE_ID = PAAM.ASSIGNMENT_STATUS_TYPE_ID )
        JOIN PER_LEGISLATIVE_DATA_GROUPS_VL LDG ON ( LDG.LEGISLATION_CODE = PAAM.LEGISLATION_CODE )
        LEFT JOIN PAY_PAYROLL_ACTIONS PPA ON ( PPA.PAYROLL_ID = PY.PAYROLL_ID
                                               AND PPA.PAYROLL_ACTION_ID = PPRA.PAYROLL_ACTION_ID 
                                               -- TEJASH : SUGGESTION-1 : ADDED FOLLOWING CONDITIONS IN JOIN CONDITIONS INSTEAD OF WHERE CLAUSE
                                               AND PPA.ACTION_TYPE IS NULL
                                               -- CHANGED FOLLOWING CONDITION TO USE DATES RATHER THAN CHAR
                                               AND NVL(PPA.EFFECTIVE_DATE, DATE '2019-09-01') BETWEEN DATE '2019-09-01' AND DATE '2019-12-01'
                                               AND PPA.CONSOLIDATION_SET_ID = PCS.CONSOLIDATION_SET_ID
                                               AND NVL(PPA.EFFECTIVE_DATE, TRUNC(SYSDATE)) BETWEEN PAYREL.START_DATE AND PAYREL.END_DATE
                                               AND NVL(PPA.EFFECTIVE_DATE, TRUNC(SYSDATE)) BETWEEN PAPD.START_DATE AND PAPD.END_DATE )
        -- TEJASH : SUGGESTION-2 : USE LEFT JOIN HERE
        LEFT JOIN PAY_TIME_PERIODS PTP ON ( PPA.EARN_TIME_PERIOD_ID = PTP.TIME_PERIOD_ID )
    WHERE
        1 = 1
        AND PTP.PAYROLL_ID = PY.PAYROLL_ID
        AND PAAM.ASSIGNMENT_TYPE = 'E' 
           --ADDED condition---    
        AND PASV.USER_STATUS LIKE '%Payroll Eligible'
        AND ( FINC > PTP.START_DATE
              OR FINC IS NULL )
    -- COMMENTED BY TEJASH
    --    AND ( PPA.ACTION_TYPE IS NULL 
    --              OR ppa.action_type IN ( 'Q', 'R' )
    --     ) 
           --  AND ldg.name = Nvl(:P_LEGISLATIVE_GROUP, ldg.name)  
           --AND pasv.user_status = Nvl(:P_ASSIGNMENT_STATUS,  
           --                     pasv.user_status)  
        -- COMMENTED BY TEJASH
        --AND TO_CHAR(NVL(PPA.EFFECTIVE_DATE, '2019-09-01'), 'YYYY-MM-DD') BETWEEN ( '2019-09-01' ) AND ( '2019-12-01' ) 
           -------    
        --AND PPA.CONSOLIDATION_SET_ID = PCS.CONSOLIDATION_SET_ID
        AND PAYREL.GROUP_TYPE = 'A'
        AND NAME.NAME_TYPE = 'GLOBAL'
        --AND NVL(PPA.EFFECTIVE_DATE, TRUNC(SYSDATE)) BETWEEN PAYREL.START_DATE AND PAYREL.END_DATE
        --AND NVL(PPA.EFFECTIVE_DATE, TRUNC(SYSDATE)) BETWEEN PAPD.START_DATE AND PAPD.END_DATE
        AND TRUNC(SYSDATE) BETWEEN PAPF.EFFECTIVE_START_DATE AND PAPF.EFFECTIVE_END_DATE
        AND TRUNC(SYSDATE) BETWEEN PY.EFFECTIVE_START_DATE AND PY.EFFECTIVE_END_DATE
        AND TRUNC(SYSDATE) BETWEEN PAAM.EFFECTIVE_START_DATE AND PAAM.EFFECTIVE_END_DATE
        AND TRUNC(SYSDATE) BETWEEN NAME.EFFECTIVE_START_DATE AND NAME.EFFECTIVE_END_DATE
    

    乾杯!!



    1. PostgreSQLでCOPYを実行するとシーケンスが更新されないのはなぜですか?

    2. Mysql PHPで生成されたテーブル:Tablesorterでは機能しません

    3. cx_oracleをPyinstallerにバンドルする方法

    4. Postgresql:無効な正規表現:無効な後方参照番号