我想了解在代表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
我收到错误消息,不支持使用任何简单的方式编写以上查询。
答案 0 :(得分:2)
本质上,当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
联接时有一个微妙之处,即嵌套顺序必须保持联接的方向,例如:
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