【问题标题】:LEFT JOIN SQL Join Expression not supported不支持 LEFT JOIN SQL 连接表达式
【发布时间】:2015-04-25 11:29:05
【问题描述】:

我找不到这个 SQL 表达式有什么问题:

SELECT DISTINCT PNLTERM.TAGSTRIP, TERMS.TERM, PNLTERM.STRIPSEQ, TERMS.WIRENO, 
TERMS.REF, TERMS.MFG, TERMS.CAT, TERMS.BLOCK, PNLTERM.HDL, TERMS.WDBLKNAM, 
TERMS.JUMPER_ID, WIREFRM2.WIRELAY
FROM (PNLTERM LEFT JOIN TERMS ON PNLTERM.LINKTERM = TERMS.LINKTERM) 
INNER JOIN WIREFRM2 ON TERMS.HDL = WIREFRM2.COMP_HDL;

这与 PNLTERM/TERMS 上的左连接有关;因为它适用于内连接和右连接,但不适用于左连接。 错误是“不支持连接表达式”。

有什么想法吗?

【问题讨论】:

  • 可能是那些不必要的括号。
  • 我读过的所有其他内容似乎都表明这些错误发生在括号不足的情况下!
  • 那只是表示先执行左连接
  • 为了使查询在语义和句法上正确,括号不是必需的。查询优化器实际上总是会比您更好地找出最有效的操作顺序(基于索引和统计信息)。

标签: sql ms-access join left-join


【解决方案1】:

MS Access 有一些关于其使用 LEFT/RIGHT 连接和 INNER 连接的规则。具体来说,有一个关于其混合的规则。解释为here

LEFT JOIN 或 RIGHT JOIN 可以嵌套在 INNER JOIN 中,但 INNER JOIN 不能嵌套在 LEFT JOIN 或 RIGHT JOIN 中。

您有几个选择:您可以将第二个联接转换为左联接:

SELECT DISTINCT PNLTERM.TAGSTRIP, TERMS.TERM, PNLTERM.STRIPSEQ, TERMS.WIRENO, 
TERMS.REF, TERMS.MFG, TERMS.CAT, TERMS.BLOCK, PNLTERM.HDL, TERMS.WDBLKNAM, 
TERMS.JUMPER_ID, WIREFRM2.WIRELAY
FROM (PNLTERM LEFT JOIN TERMS ON PNLTERM.LINKTERM = TERMS.LINKTERM) 
LEFT JOIN WIREFRM2 ON TERMS.HDL = WIREFRM2.COMP_HDL;

或者,您可以更改查询,以便首先使用 INNER 连接:

SELECT DISTINCT PNLTERM.TAGSTRIP, TERMS.TERM, PNLTERM.STRIPSEQ, TERMS.WIRENO, 
TERMS.REF, TERMS.MFG, TERMS.CAT, TERMS.BLOCK, PNLTERM.HDL, TERMS.WDBLKNAM, 
TERMS.JUMPER_ID, WIREFRM2.WIRELAY
FROM (WIREFRM2 INNER JOIN TERMS ON TERMS.HDL = WIREFRM2.COMP_HDL) 
RIGHT JOIN PNLTERM ON PNLTERM.LINKTERM = TERMS.LINKTERM;

【讨论】:

  • 感谢@cha,如果我将您第二个建议中的 INNER JOIN 更改为 RIGHT JOIN,我认为这将达到我想要的结果
  • 哦,现在还有一个问题。看来我不能把 RIGHT JOIN 放在最后?
  • 查看您的查询,我可以看到两个 LEFT 连接应该更适合您的情况
  • 我需要在 PNLTERM 表中包含所有记录。据我所知,这只能通过右连接来实现,或者我的第一种方法是先放置左连接?
猜你喜欢
  • 1970-01-01
  • 2020-11-30
  • 2014-08-11
  • 1970-01-01
  • 2016-04-18
  • 1970-01-01
  • 1970-01-01
  • 2017-04-12
  • 2015-12-14
相关资源
最近更新 更多