簡體   English   中英

Oracle到MS-Access SQL:

[英]Oracle to MS-Access SQL:

我試圖將SQL代碼從Oracle復制到Access,以自動創建一些報告。 到目前為止,我已經成功了,但是我遇到了一個麻煩:

這是Oracle SQL:

SELECT DISTINCT o587265.PROJECT_NUMBER AS E587273,
    o587265.PROJECT_NAME AS E587274,
    o587265.PROJECT_STATUS_CODE AS E587275,
    o587265.PROJECT_MANAGER AS E587276
FROM (
    SELECT p.segment1 project_number,
        p.NAME project_name,
        p.project_status_code,
        (
            SELECT a.FULL_NAME
            FROM apps.per_all_people_f a,
                apps.pa_project_players_v pm
            WHERE a.person_id = pm.person_id
                AND pm.project_ID = p.project_ID
                AND pm.ROLE = 'Project Manager'
                AND a.current_employee_flag = 'Y'
                AND a.person_type_id = 1
                AND SYSDATE BETWEEN a.effective_start_date
                    AND a.effective_end_date
                AND SYSDATE BETWEEN pm.start_date_active(+)
                    AND NVL(pm.end_date_active, SYSDATE)
            ) project_manager
    FROM apps.pa_projects_all p
    WHERE p.project_status_code != 'CLOSED'
        AND p.template_flag = 'N'
        AND p.org_ID = 5003
    ) o587265
    ORDER BY o587265.PROJECT_NUMBER ASC,
    o587265.PROJECT_NAME ASC,
    o587265.PROJECT_MANAGER ASC;

這是我當前的MS-Access版本:

SELECT DISTINCT o587265.PROJECT_NUMBER AS E587273,
    o587265.PROJECT_NAME AS E587274,
    o587265.PROJECT_STATUS_CODE AS E587275,
    o587265.PROJECT_MANAGER AS E587276
FROM (
    SELECT p.segment1 AS project_number,
        p.NAME AS project_name,
        p.project_status_code,
        (
            SELECT a.FULL_NAME
            FROM ((apps_per_all_people_f AS a INNER JOIN apps_pa_project_players_v AS pm ON a.person_id = pm.person_id
                ) INNER JOIN apps_pa_projects_all AS p ON pm.project_ID = p.project_ID
            )
            WHERE pm.ROLE = 'Project Manager'
                AND a.current_employee_flag = 'Y'
                AND a.person_type_id = 1
                AND DATE () BETWEEN a.effective_start_date
                AND a.effective_end_date
                AND DATE () BETWEEN pm.start_date_active
                AND IIf(IsNull(pm.end_date_active), DATE (), pm.end_date_active)
            ) AS PROJECT_MANAGER
    FROM apps_pa_projects_all AS p
    WHERE p.project_status_code <> 'CLOSED'
        AND p.template_flag = 'N'
        AND p.org_ID = 5003
    ) AS o587265
ORDER BY o587265.PROJECT_NUMBER ASC,
    o587265.PROJECT_NAME ASC,
    o587265.PROJECT_MANAGER ASC;

第一個直接在Oracle 11g(SQL Developer)上運行並可以運行。 MS-Access似乎在子查詢中返回多個行。 我用盡了我的知識,但似乎無法復制它。

我究竟做錯了什么?

另外,Oracle SQL代碼中的這個(+)運算符是什么?

我將這個運算符稱為OUTER(左/右)聯接,但是我從未見過像那樣使用它,而且絕對不是聯接。

有人能幫我嗎?

可能是在Oracle的MS Access顯式INNER JOIN的隱式INNER JOIN轉換中,您在派生表的子查詢的PROJECT_MANAGER列中引用了apps_pa_projects_all表,從而添加了一個附加的INNER JOIN ,從而代替了別名p 但是,此子查詢與具有原始別名p的外部FROM子句的派生表apps_pa_projects_all相關:

考慮刪除第二個INNER JOIN並返回相關的WHERE子句條件:

原版的

...
    (
        SELECT a.FULL_NAME
        FROM ((apps_per_all_people_f AS a 
        INNER JOIN apps_pa_project_players_v AS pm 
                ON a.person_id = pm.person_id) 
        INNER JOIN apps_pa_projects_all AS p 
                ON pm.project_ID = p.project_ID)
        WHERE pm.ROLE = 'Project Manager'
         AND a.current_employee_flag = 'Y'
         ...

更改

...
    (
        SELECT a.FULL_NAME
        FROM apps_per_all_people_f AS a 
        INNER JOIN apps_pa_project_players_v AS pm 
                ON a.person_id = pm.person_id
        WHERE pm.project_ID = p.project_ID
         AND pm.ROLE = 'Project Manager'
         AND a.current_employee_flag = 'Y'
         ...

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM