SQL:加入语法错误

Posted

技术标签:

【中文标题】SQL:加入语法错误【英文标题】:SQL: JOIN syntax error 【发布时间】:2013-10-19 23:28:37 【问题描述】:

我正在尝试消除不需要的重复查询结果。要点是字段 [CUSIP] 存在于所有相关表中,但是字段 [4DTYR] 存在于除 [IDX_FS] 之外的所有表中。

我之前只通过 [CUSIP] 字段加入表,这导致查询产生了不需要的重复结果(包含该字段的所有表中 [4DTYR] 的某种排列)。

然后,我做了下面的修改。但是,现在我收到一个 JOIN 语法错误。任何人都可以帮忙吗?谢谢!

FROM 

(((IDX_FS LEFT JOIN DATA_BS 
  ON IDX_FS.CUSIP = DATA_BS.CUSIP) 

LEFT JOIN DATA_Footnotes 
  ON IDX_FS.CUSIP = DATA_Footnotes.CUSIP) 

LEFT JOIN DATA_IS 
  ON IDX_FS.CUSIP = DATA_IS.CUSIP) 

LEFT JOIN DATA_SP 
  ON IDX_FS.CUSIP = DATA_SP.CUSIP 

AND (((DATA_BS LEFT JOIN DATA_IS 
  ON DATA_BS.CUSIP = DATA_IS.CUSIP 
     AND DATA_BS.4DTYR = DATA_IS.4DTYR) 

LEFT JOIN DATA_SP 
  ON DATA_BS.CUSIP = DATA_SP.CUSIP 
     AND DATA_BS.4DTYR = DATA_SP.4DTYR) 

LEFT JOIN DATA_Footnotes.4DTYR 
  ON DATA_BS.CUSIP = DATA_Footnotes.CUSIP 
     AND DATA_BS.4DTYR = DATA_Footnotes.4DTYR

【问题讨论】:

请格式化您的代码? 您好,我已尽我所能重新格式化。我对此真的很陌生! 你为什么一次又一次地转发你的问题? 您已经发布了this,随后又发布了this。请参阅this 了解更多信息。 【参考方案1】:

您的( 似乎太多了:

FROM 
     (
      (
       (IDX_FS LEFT JOIN DATA_BS ON IDX_FS.CUSIP = DATA_BS.CUSIP) 
       LEFT JOIN DATA_Footnotes ON IDX_FS.CUSIP = DATA_Footnotes.CUSIP
      ) 
      LEFT JOIN DATA_IS ON IDX_FS.CUSIP = DATA_IS.CUSIP
     ) 
     LEFT JOIN DATA_SP ON IDX_FS.CUSIP = DATA_SP.CUSIP AND 
     ( -- This is unmatched
      (
       (DATA_BS LEFT JOIN DATA_IS ON DATA_BS.CUSIP = DATA_IS.CUSIP AND DATA_BS.4DTYR = DATA_IS.4DTYR)     
       LEFT JOIN DATA_SP ON DATA_BS.CUSIP = DATA_SP.CUSIP AND DATA_BS.4DTYR = DATA_SP.4DTYR
      ) 
      LEFT JOIN DATA_Footnotes.4DTYR ON DATA_BS.CUSIP = DATA_Footnotes.CUSIP AND DATA_BS.4DTYR = DATA_Footnotes.4DTYR
     -- A ) here perhaps?

【讨论】:

谢谢!我试过你的编辑,现在我得到一个缺少操作员的错误? 我猜在不匹配的括号之前还有更多错误。 AND真的应该在那里吗? 我是个看不出来的菜鸟!我现在正在尝试不使用 AND。【参考方案2】:

在 FROM 阶段我们指定需要查询的一个或多个表,以及如果表操作符 指定,此阶段从左到右处理这些运算符。连接(左/右)是表运算符,每个表运算符对一个或两个输入表进行操作并返回一个输出表。表运算符的结果用作下一个表运算符的左输入(如果存在),否则用作下一个逻辑查询处理阶段的输入。 在您的查询中,我发现了两个问题:

    您是否希望在与 DATA_SP 左连接时将整个“AND”条件(第 15 行)添加为 ON 子句中的过滤条件? 在最后一行中,您尝试在 DATA_Footnotes 表的字段 [4DTYR] 上指定左连接,因为左连接运算符希望提供一个表,所以该左连接不正确。

我认为像下面这样的伪代码可能会有所帮助:

select IDX_FS.CUSIP , DATA_BS.[4DTYR] 
FROM 
  IDX_FS
  LEFT JOIN DATA_BS 
  ON IDX_FS.CUSIP = DATA_BS.CUSIP
  LEFT JOIN DATA_Footnotes 
  ON IDX_FS.CUSIP = DATA_Footnotes.CUSIP AND DATA_BS.CUSIP = DATA_Footnotes.CUSIP  AND DATA_BS.[4DTYR] = DATA_Footnotes.[4DTYR]
  LEFT JOIN DATA_IS 
  ON IDX_FS.CUSIP = DATA_IS.CUSIP AND DATA_BS.CUSIP = DATA_IS.CUSIP AND DATA_BS.[4DTYR] = DATA_IS.[4DTYR]
  LEFT JOIN DATA_SP 
  ON IDX_FS.CUSIP = DATA_SP.CUSIP AND DATA_BS.CUSIP = DATA_SP.CUSIP AND DATA_BS.[4DTYR] = DATA_SP.[4DTYR]
  -- LEFT JOIN DATA_Footnotes.[4DTYR] no need.

希望对你有帮助!!!

【讨论】:

以上是关于SQL:加入语法错误的主要内容,如果未能解决你的问题,请参考以下文章

通过 Excel VBA 进行 SQL 查询的复杂 JOIN 子句中的语法错误

加入时更新 MS Access 语法错误

sql server 子查询连接错误

oracle如何检查sql语法错误

MySQL 语法错误 |您的 SQL 语法有错误;

INSERT INTO 语句的语法错误