【问题标题】:Syntax error on Join Operation - sql view in access 2013连接操作的语法错误 - access 2013 中的 sql 视图
【发布时间】:2015-06-15 02:57:03
【问题描述】:

我正在尝试在 access 的 sql 视图中进行一些复杂的连接,但真的很难知道为什么会出现错误。我更精通在 SQL 本身中使用 SQL 连接,并且在给出错误时访问的 SQL 视图确实令人困惑。我不知道我需要做什么来修复这个错误。请看下文。

SELECT Table1.PAT_NAME AS PATNM, 
       Table1.PAT_MRN_ID AS MRN, 
       Table2.Start_Date AS StartDT, 
       Table2.END_date AS ENDDT, 
       Table2.episode_ID AS EPSDID, 
       Table2.POS_NAME AS POS, 
       Table3.READMITDT AS READMITD
FROM Table2 
    LEFT JOIN ( Table1 ON Table2.PAT_MRN_ID = Table1.PAT_MRN_ID)
    JOIN (Table3 ON Table1.PAT_ID = Table3.PATIDR AND
         ( Table3.READMITDT <= dateadd("d", 1, isnull(Table2.END_DATE,NOW())
          OR Table3.READMITDT < dateadd("d", 30, Table2.START_DATE))
          AND Table3.READMITDT >= Table2.start_date))

【问题讨论】:

    标签: ms-access join ms-access-2010 sql-view


    【解决方案1】:

    这是一个问题...

    JOIN (Table3 ON Table1.PAT_ID = Table3.PATIDR
    ^^^^
    

    Access SQL 不单独接受JOIN。您必须始终指定所需的连接类型:INNER JOINLEFT JOIN;或RIGHT JOIN

    使用查询设计器的设计视图(而不是 SQL 视图)来设置您的联接。查询设计者知道使数据库引擎满意的语法规则。稍后,您可以切换回 SQL 视图以查看您的有效连接是如何在那里表示的。

    Access SQL 将LEFT OUTER JOIN 识别为LEFT JOIN 的同义词,将RIGHT OUTER JOIN 识别为RIGHT JOIN 的同义词。当您在查询设计器中编辑查询时,它可能会丢弃 OUTER,但您可以在不破坏工作查询的情况下将其添加回来。

    考虑将这些 DateAdd 条件移动到查询的 WHERE 子句中。

    【讨论】:

    • 感谢您的信息。我首先使用查询设计器。当我修改示例时,我一定只是省略了连接类型,但很高兴知道.. 我不知道。在我离开查询设计器之后,它变得复杂起来。括号的位置总是令人困惑。我最终将 dateadd 放在了 where 子句中,这似乎让事情变得不那么混乱。谢谢!我多次返回查询设计器,一次又一次地添加短语,直到我弄明白为止。这花了我一天的大部分时间才弄好!
    【解决方案2】:
    it is better to use WHERE Clause after join operation. remove 'and'
    
    JOIN Table3 ON (Table1.PAT_ID = Table3.PATIDR) AND
          (Table3.READMITDT <= dateadd("d", 1, isnull(Table2.END_DATE,NOW())
          OR Table3.READMITDT < dateadd("d", 30, Table2.START_DATE) 
          AND Table3.READMITDT >= Table2.start_date))
    
    should be
    
    
    JOIN Table3 ON (Table1.PAT_ID = Table3.PATIDR) 
    WHERE
          (Table3.READMITDT <= dateadd("d", 1, isnull(Table2.END_DATE,NOW())
          OR Table3.READMITDT < dateadd("d", 30, Table2.START_DATE) 
          AND Table3.READMITDT >= Table2.start_date))
    

    【讨论】:

    • 我现在想通了。谢谢大家!
    【解决方案3】:

    我不熟悉 ms access sql。但我认为 LEFT JOIN 应该是 LEFT OUTER JOIN 并且你的括号是错误的。 after Join 括号应该在 ON 子句之前的表之后打开 看下面的例子

    FROM Table2 LEFT JOIN (Table1 ON Table2.PAT_MRN_ID = Table1.PAT_MRN_ID) 应更改为
    FROM Table2 LEFT OUTER JOIN Table1 ON (Table2.PAT_MRN_ID = Table1.PAT_MRN_ID)

    【讨论】:

    • 谢谢,我做了更改,但现在它告诉我我缺少一个运算符并给出了整个 from 语句,所以很难判断缺少的运算符在哪里。
    • join操作后最好使用WHERE子句。删除 'and' 加入 Table3 ON (Table1.PAT_ID = Table3.PATIDR) AND (Table3.READMITDT = Table2.start_date)) 应该是 JOIN Table3 ON (Table1.PAT_ID = Table3.PATIDR) WHERE (Table3.READMITDT = Table2.start_date))
    【解决方案4】:

    我通过语法检查器 https://sql.treasuredata.com/ 运行它。这个版本没有语法错误。

    SELECT
      Table1.PAT_NAME AS PATNM
     ,Table1.PAT_MRN_ID AS MRN
     ,Table2.Start_Date AS StartDT
     ,Table2.END_date AS ENDDT
     ,Table2.episode_ID AS EPSDID
     ,Table2.POS_NAME AS POS
     ,Table3.READMITDT AS READMITD
    FROM
      Table2
      LEFT OUTER JOIN Table1 ON (Table2.PAT_MRN_ID = Table1.PAT_MRN_ID)
      JOIN Table3 ON (Table1.PAT_ID = Table3.PATIDR) AND
          (Table3.READMITDT <= dateadd("d", 1, isnull(Table2.END_DATE,NOW())
          OR Table3.READMITDT < dateadd("d", 30, Table2.START_DATE) 
          AND Table3.READMITDT >= Table2.start_date))
    

    【讨论】:

    • 谢谢 - 我都试过了,但在 From 子句中仍然出现语法错误。我喜欢将它保留为 where 语句,但如果它给我的结果与我在 SQL 中的结果相同。此外,我必须在两个语句周围留下额外的括号 OR,因为这是更大的 AND 语句的一部分。它需要只是这两者的或。这是我在 JOIN Table3 ON (Table1.PAT_ID = Table3.PATIDR) WHERE (Table3.READMITDT = Table2.start_date
    • 对不起上面的代码.. 这里又是一个例子 JOIN Table3 ON (Table1.PAT_ID = Table3.PATIDR) WHERE (Table3.READMITDT = Table2.start_date
    猜你喜欢
    • 2013-05-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多