何时在MS Access SQL中打开和关闭方括号

时间:2018-12-02 17:50:34

标签: sql ms-access

我想了解在代表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

我收到错误消息,不支持使用任何简单的方式编写以上查询。

1 个答案:

答案 0 :(得分:2)

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

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

enter image description here

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

要添加第三个联接表,必须在原始联接周围加上括号,以便将其与附加联接区分开来。

enter image description here

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

每一次连续添加一个表,都会导致现有联接嵌套在另一级括号内:

enter image description here

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联接时有一个微妙之处,即嵌套顺序必须保持联接的方向,例如:

enter image description here

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