【问题标题】:Translating Oracle SQL to Access Jet SQL, Left Join将 Oracle SQL 转换为 Access Jet SQL,左连接
【发布时间】:2011-10-03 21:47:05
【问题描述】:

这里一定有我遗漏的东西。我在 Toad 中有一个漂亮、漂亮的 Oracle SQL 语句,它会返回一个包含我想要的 ID 的所有在职人员的列表:

SELECT PERSONNEL.PERSON_ID,
       PERSONNEL.NAME_LAST_KEY,
       PERSONNEL.NAME_FIRST_KEY,
       PA_EID.ALIAS EID,
       PA_IDTWO.ALIAS IDTWO,
       PA_LIC.ALIAS LICENSENO
  FROM PERSONNEL
       LEFT JOIN PERSONNEL_ALIAS PA_EID
          ON     PERSONNEL.PERSON_ID = PA_EID.PERSON_ID
             AND PA_EID.PERSONNEL_ALIAS_TYPE_CD = 1086
             AND PA_EID.ALIAS_POOL_CD = 3796547
             AND PERSONNEL.ACTIVE_IND = 1
       LEFT JOIN PERSONNEL_ALIAS PA_IDTWO
          ON     PERSONNEL.PERSON_ID = PA_IDTWO.PERSON_ID
             AND PA_IDTWO.PERSONNEL_ALIAS_TYPE_CD = 3839085
             AND PA_IDTWO.ACTIVE_IND = 1
       LEFT JOIN PERSONNEL_ALIAS PA_LIC
          ON     PERSONNEL.PERSON_ID = PA_LIC.PERSON_ID
             AND PA_LIC.PERSONNEL_ALIAS_TYPE_CD = 1087
             AND PA_LIC.ALIAS_POOL_CD = 683988
             AND PA_LIC.ACTIVE_IND = 1
 WHERE PERSONNEL.ACTIVE_IND = 1 AND PERSONNEL.PHYSICIAN_IND = 1;

这很好用。我遇到问题的地方是当我将它放入 Access 时。我知道,我知道,访问糟透了。有时需要使用它,特别是如果一个人有多种数据库类型,他们只想在其中存储一些查询,尤其是如果一个老板只知道 Access。无论如何,我在使用 FROM 中的 AND 时遇到了问题,所以我将它们移到了 WHERE,但出于某种奇怪的原因,Access 没有进行 LEFT JOIN,返回那些具有 EID 的人员, IDTWO 和 LICENSENO 的。不是每个人都具备这三个条件。

到目前为止,Access 中的最佳镜头是:

SELECT PERSONNEL.PERSON_ID, 
            PERSONNEL.NAME_LAST_KEY, 
            PERSONNEL.NAME_FIRST_KEY, 
            PA_EID.ALIAS AS EID, 
            PA_IDTWO.ALIAS AS ID2, 
            PA_LIC.ALIAS AS LICENSENO

FROM ((PERSONNEL 
        LEFT JOIN PERSONNEL_ALIAS AS PA_EID ON PERSONNEL.PERSON_ID=PA_EID.PERSON_ID) 
        LEFT JOIN PERSONNEL_ALIAS AS PA_IDTWO ON PERSONNEL.PERSON_ID=PA_IDTWO.PERSON_ID) 
        LEFT JOIN PERSONNEL_ALIAS AS PA_LIC ON PERSONNEL.PERSON_ID=PA_LIC.PERSON_ID

WHERE (((PERSONNEL.ACTIVE_IND)=1) 
        AND ((PERSONNEL.PHYSICIAN_IND)=1) 
        AND ((PA_EID.PRSNL_ALIAS_TYPE_CD)=1086) 
        AND ((PA_EID.ALIAS_POOL_CD)=3796547) 
        AND ((PA_IDTWO.PRSNL_ALIAS_TYPE_CD)=3839085) 
        AND ((PA_IDTWO.ACTIVE_IND)=1) 
        AND ((PA_LIC.PRSNL_ALIAS_TYPE_CD)=1087) 
        AND ((PA_LIC.ALIAS_POOL_CD)=683988) 
        AND ((PA_LIC.ACTIVE_IND)=1));

我认为问题的一部分可能是我对所有三个连接都使用了相同的别名(查找)表。也许有更有效的方法来做到这一点?对 SQL 领域来说还是新手,所以任何提示都会很棒。我觉得这些应该是等价的,但是 Toad 查询给我返回了许多不完美的行,而 Access 给我的不到 500 行。我需要找到每个人,这样没有人会被遗漏.几乎就好像 LEFT JOIN 在 Access 中根本不起作用。

【问题讨论】:

标签: sql oracle ms-access left-join jet


【解决方案1】:

要了解您在做什么,让我们看一下您的查询的简化版本:

SELECT PERSONNEL.PERSON_ID,    
       PA_EID.ALIAS AS EID          
FROM PERSONNEL         
LEFT JOIN PERSONNEL_ALIAS AS PA_EID ON PERSONNEL.PERSON_ID=PA_EID.PERSON_ID         
WHERE PERSONNEL.ACTIVE_IND=1       
        AND PERSONNEL.PHYSICIAN_IND=1      
        AND PA_EID.PRSNL_ALIAS_TYPE_CD=1086
        AND PA_EID.ALIAS_POOL_CD=3796547     

如果 LEFT JOIN 找到匹配项,您的行可能如下所示:

Person_ID    EID
12345        JDB

如果没有找到匹配项,(暂时忽略 WHERE 子句),它可能看起来像:

Person_ID    EID
12345        NULL

当你添加上面的 WHERE 子句时,你告诉它只在 PERSONNEL_ALIAS 表中查找满足条件的记录,但是如果没有找到记录,那么这些值被认为是 NULL,所以它们永远不会满足 WHERE 条件并且不会返回任何记录...

正如 Joe Stefanelli 在他的评论中所说,向 LEFT JOIN'ed 表添加 WHERE 子句使其充当 INNER JOIN...

【讨论】:

  • 那么如果我将这些 WHERE 条件添加回 Access 中的 FROM 中,我会得到我想要的结果吗?我将不得不再与括号作斗争。谢谢!
  • 啊。没有多少括号可以使这项工作。无论我做什么,我总是在 Access 中收到“不支持 JOIN 表达式”错误。 ://
  • 好的,我最终做的是在“子查询”的 WHERE 语句中使用我想要的 AND 进行 3 个访问查询,然后将它们连接到我的主 PERSONNEL 表中。感谢大量关于 WHERE 语句的教育;我需要记住,访问方式与 SQL 方式不同。
【解决方案2】:

除了@Sparky 的回答之外,要获得与您在 Oracle 中所做的等效的操作,您需要在加入它们之前从表的“外部”侧过滤行 .一种方法可能是:

  1. 对于需要从中筛选行的联接“外部”侧的每个表(即 PERSONNEL_ALIAS 的三个实例),创建一个用于筛选所需行的查询。例如,第一个查询(例如,名为 PA_EID)可能看起来像这样:SELECT PERSONNEL_ALIAS.* FROM PERSONNEL_ALIAS WHERE PERSONNEL_ALIAS.PERSONNEL_ALIAS_TYPE_CD = 1086 AND PERSONNEL_ALIAS.ALIAS_POOL_CD = 3796547

  2. 在原始帖子中的“迄今为止在 Access 中的最佳镜头”查询中:a) 将 PERSONNEL_ALIAS 的每个实例替换为在步骤 1 中创建的相应查询,并且 b) 删除相应的条件(在 PA_EID 上, PA_IDTWO 和 PA_LIC) 来自 WHERE 子句。

【讨论】:

  • 这几乎就是我最终所做的,但使用了 Access 的点击式查询。过滤掉之前工作的那些,然后当它们加入时,子查询中为空的那些将在主查询中结束。谢谢!如果我有 15 个代表,我会支持你。
  • 我会支持他,因为他在答案中添加了有益的信息。
猜你喜欢
  • 1970-01-01
  • 2012-03-25
  • 2016-12-19
  • 2015-09-30
  • 1970-01-01
  • 1970-01-01
  • 2016-10-02
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多