Когда открывать и закрывать скобки, окружающие объединения в MS Access SQL - PullRequest
0 голосов
/ 02 декабря 2018

Я хочу понять, когда открывать и закрывать скобки при представлении объединений в запросах 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 голосов
/ 02 декабря 2018

По сути, когда запрос 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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...