繁体   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