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

Oracleのクエリの外部でidが一致する場所を選択するようにテーブルセットの列を更新します

    UPDATE で WITH を使用する場合、更新テーブルにエイリアスを使用する必要があります。そうでなければ機能しません。

    また、WITH CLAUSE で UPDATED TABLE を呼び出すことはできません。その時点では、そのテーブルは不明です。そのため、INVALID IDENTIFIER が返されます。問題を解決するには、その条件を削除して最後に追加する必要があります。

    これを試してみてください。ただし、データ モデルも知らずに書いているので注意してください。

    UPDATE SNP_FACULTY_CENSUS SFC
    SET OIR_TERMINAL_DEGREE = (
      WITH HIGHES_DEG_VALUE AS (
        SELECT max(D.OIR_DEGREE_HIERARCHY) AS MAX_DEG
        FROM VPAA_PPAGGENL_FIS  V
        JOIN DIM_DEGREE_CROSSWALK D
            ON V.VPAA_FACULTY_DEGREE_CODE = D.VPAA_DEGREE_CODE  
        LEFT JOIN SNP_FACULTY_CENSUS S 
            ON V.PERSON_SKEY = S.PERSON_SKEY
         ) 
    SELECT 
    CASE 
        WHEN MAX_DEG = 30 
            THEN  --CHECK IF EXIST ON CROSSWALKS AND USE THAT VALUE IF IT DOES
            (CASE
                WHEN EXISTS (SELECT V.VPAA_FACULTY_DEGREE_CODE, --IF ON SUBJ CODE CROSSWALK
                             V.VPAA_FACULTY_SUBJECT_CODE
                             FROM VPAA_PPAGGENL_FIS V
                             JOIN DIM_DEGREE_CROSSWALK D
                             ON V.VPAA_FACULTY_DEGREE_CODE = D.VPAA_DEGREE_CODE 
                             INNER JOIN  SUBJ_CODE_CROSSWALK  S
                             ON V.VPAA_FACULTY_DEGREE_CODE = S.VPAA_FACULTY_DEGREE_CODE
                                and S.VPAA_FACULTY_SUBJECT_CODE = V.VPAA_FACULTY_SUBJECT_CODE 
                                WHERE V.PERSON_SKEY = SNP_FACULTY_CENSUS.PERSON_SKEY ----CHANGE TO  = SRC.PERSON_SKEY
                             )
                    THEN (SELECT DISTINCT  -- USE TERMINAL VALUE FROM SUBJ CODE
                           CASE
                                 WHEN s.OIR_TERMINAL_DEGREE_STATUS =
                                      'Terminal'
                                 THEN
                                     'Yes'
                                 WHEN s.OIR_TERMINAL_DEGREE_STATUS =
                                      'Not terminal'
                                 THEN
                                     'No'
                                 ELSE
                                     'Unknown'
                            END
                          FROM SUBJ_CODE_CROSSWALK  S
                                       INNER JOIN VPAA_PPAGGENL_FIS V
                                           ON V.VPAA_FACULTY_DEGREE_CODE =
                                              S.VPAA_FACULTY_DEGREE_CODE
                                        AND S.VPAA_FACULTY_SUBJECT_CODE =
                                              V.VPAA_FACULTY_SUBJECT_CODE
                                        WHERE  V.PERSON_SKEY = SNP_FACULTY_CENSUS.PERSON_SKEY )----CHANGE TO  = SRC.PERSON_SKEY )                        
        
                WHEN EXISTS (SELECT DISTINCT V.VPAA_FACULTY_DEGREE_CODE, --IF ON CLIC INSTRUCTORS CROSSWALK
                                    V.VPAA_FACULTY_SUBJECT_CODE,
                                    I.OIR_EMPLOYEE_DEPARTMENT_HOME_ORG
                             FROM VPAA_PPAGGENL_FIS V
                             INNER JOIN CLIC_INSTRUCTORS_CROSSWALK C
                             ON V.VPAA_FACULTY_DEGREE_CODE = C.VPAA_FACULTY_DEGREE_CODE 
                             AND V.VPAA_FACULTY_SUBJECT_CODE = C.VPAA_FACULTY_SUBJECT_CODE
                             INNER JOIN IPEDS_REPORT_DETAILS I ON V.PIDM = I.HR_PIDM
                             WHERE V.PERSON_SKEY = SNP_FACULTY_CENSUS.PERSON_SKEY ----CHANGE TO  = SRC.PERSON_SKEY
                             AND  (I.OIR_EMPLOYEE_DEPARTMENT_HOME_ORG = '396000'
                                  OR I.OIR_EMPLOYEE_DEPARTMENT_HOME_ORG = '396010')
                             ) 
                    THEN (SELECT DISTINCT 
                            CASE
                                 WHEN C.OIR_TERMINAL_DEGREE_STATUS =
                                      'Terminal'
                                 THEN
                                     'Yes'
                                 WHEN C.OIR_TERMINAL_DEGREE_STATUS =
                                      'Not terminal'
                                 THEN
                                     'No'
                                 ELSE
                                     'Unknown'
                            END  
                           FROM CLIC_INSTRUCTORS_CROSSWALK C
                           INNER JOIN VPAA_PPAGGENL_FIS V
                               ON C.VPAA_FACULTY_DEGREE_CODE =
                                  V.VPAA_FACULTY_DEGREE_CODE
                            AND C.VPAA_FACULTY_SUBJECT_CODE =
                                  V.VPAA_FACULTY_SUBJECT_CODE
                            WHERE V.PERSON_SKEY = SNP_FACULTY_CENSUS.PERSON_SKEY )----CHANGE TO  = SRC.PERSON_SKEY)
           ELSE --USE DIM DEGREE CROSSWALK NORMALLY
                (SELECT DISTINCT 
                            CASE
                                 WHEN D.OIR_TERMINAL_DEGREE_STATUS =
                                      'Terminal'
                                 THEN
                                     'Yes'
                                 WHEN D.OIR_TERMINAL_DEGREE_STATUS =
                                      'Not terminal'
                                 THEN
                                     'No'
                                 ELSE
                                     'Unknown'
                            END  
                FROM DIM_DEGREE_CROSSWALK D
                     JOIN VPAA_PPAGGENL_FIS V
                         ON V.VPAA_FACULTY_DEGREE_CODE =
                            D.VPAA_DEGREE_CODE
                   WHERE V.PERSON_SKEY = SNP_FACULTY_CENSUS.PERSON_SKEY ----CHANGE TO  = SRC.PERSON_SKEY)
                   ORDER BY OIR_DEGREE_HIERARCHY DESC
                   FETCH FIRST ROW ONLY )
            END) --USE DIM DEGREE CROSSWALK FOR THE TERMINAL VALUE FOR THE MAX DEG THERE
    
        WHEN MAX_DEG != 30
        THEN
            (SELECT DISTINCT 
                            CASE
                                 WHEN D.OIR_TERMINAL_DEGREE_STATUS =
                                      'Terminal'
                                 THEN
                                     'Yes'
                                 WHEN D.OIR_TERMINAL_DEGREE_STATUS =
                                      'Not terminal'
                                 THEN
                                     'No'
                                 ELSE
                                     'Unknown'
                            END  
                FROM DIM_DEGREE_CROSSWALK D
                 JOIN VPAA_PPAGGENL_FIS V
                     ON V.VPAA_FACULTY_DEGREE_CODE =
                        D.VPAA_DEGREE_CODE
               WHERE V.PERSON_SKEY = SNP_FACULTY_CENSUS.PERSON_SKEY ----CHANGE TO  = SRC.PERSON_SKEY)
               ORDER BY OIR_DEGREE_HIERARCHY DESC
               FETCH FIRST ROW ONLY )
        ELSE NULL
    END 
    FROM HIGHES_DEG_VALUE
    ) WHERE SNP_FACULTY_CENSUS.OIR_FALL_TERM = 'Fall 2019' ;
      

    1. SQLiteで月の第1、第2、第3、または第4月曜日を取得

    2. クエリで指定された順序によるSQLの並べ替え順序

    3. ローカルホストPHPアプリケーションからのHerokuPostgres接続

    4. MySQL5.6InnoDB全文検索