【问题标题】:When to open and close brackets surrounding joins in MS Access SQL何时在 MS Access SQL 中打开和关闭围绕联接的括号
【发布时间】:2018-12-02 17:50:33
【问题描述】:

我想了解在表示 MS Access 查询中的联接时何时打开和关闭括号,因为我正在使用 C++ 为 MS Access 查询开发一个查询构建器,以便我可以应用相同的代码来生成类似的查询。

SELECT 
    MasterTool.Name, Toolsets.SlaveToolID, Tools.MachineID  
FROM 
    Tools AS MasterTool
    LEFT JOIN 
    (
        Toolsets LEFT JOIN Tools ON Toolsets.SlaveToolID = Tools.ID
    )
    ON MasterTool.ID = Toolsets.MasterToolID

编辑:

@LeeMac 根据您的解释,当我修改我之前提出的查询时

   SELECT Tools.Name, Toolsets.SlaveToolID, Tools.MachineID  FROM (Tools  
   LEFT JOIN  Toolsets ON Toolsets.SlaveToolID = Tools.ID )
   LEFT JOIN  Tools ON  Toolsets.MasterToolID = Tools.ID

我收到错误 Join Expression Not Supported 是否有任何简单的方法可以编写上述查询。

【问题讨论】:

  • 一般来说,新手应该使用设计查看器在 MS Access GUI 中构建查询,然后在需要的地方使用保存的 SQL。事实上,由于 Access 引擎保存并缓存了最佳执行计划,因此在应用程序级别(即 C++)使用保存的查询而不是字符串运行查询更有效。
  • 您在编辑中添加的 SQL 引用了 Tools 表两次,因此,第二次引用需要别名,例如LEFT JOIN Tools t ON Toolsets.MasterToolID = t.ID

标签: sql ms-access


【解决方案1】:

本质上,当 MS Access 查询引用两个以上的表时,一对表之间的每个连续连接都应该嵌套在括号内。

例如,有两个表的查询不需要括号:

select *
from a inner join b on a.id = b.id

添加第三个连接表需要在原始连接周围加上括号,以便将其与附加连接区分开来:

select *
from 
(
    a inner join b on a.id = b.id
) 
inner join c on a.id = c.id

每次连续添加一个表都会导致现有的连接嵌套在另一层括号中:

select *
from 
(
    (
        a inner join b on a.id = b.id
    ) 
    inner join c on a.id = c.id
)
inner join d on a.id = d.id

因此,一般来说:

select *
from 
(
    (
        (
            (
                table1 [inner/left/right] join table2 on [conditions]
            ) 
            [inner/left/right] join table3 on [conditions]
        )
        [inner/left/right] join table4 on [conditions]
    )
    ...
)
[inner/left/right] join tableN on [conditions]

LEFT/RIGHT join 有一个微妙的地方,嵌套的顺序必须保持 join 的方向,例如:

select *
from 
(
    c left join b on c.id = b.id
) 
left join a on a.id = b.id

可以改写为:

select *
from 
c left join
(
    b left join a on b.id = a.id
)
on c.id = b.id

【讨论】:

  • 关于您的最终评论,您写了a left join something 并断言这与something left join a 不一样——不管括号,在任何数据库中都不是这样吗?
  • 我想知道的另一件事;如果一个人只写普通的a left join b left join c 查询,访问是否会出现问题?他们在 odbc/jet 驱动程序中工作;我想知道是否必须在访问本身内为查询加上括号?
  • 括号对是 Access 的 SQL 方言的一部分。有趣的是 JET ODBC 驱动程序不需要它们,我很难相信。会检查的。
  • @CaiusJard 你说的很对 - 这是一个不好的例子 - 我已经更新了我的答案,(希望)更好地解释了我试图传达的内容。是的,MS Access 将抛出一个语法错误,每对表周围没有括号。
猜你喜欢
  • 1970-01-01
  • 2013-04-09
  • 1970-01-01
  • 2019-06-10
  • 1970-01-01
  • 2012-01-19
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多