2016-06-29 3 views
0

У меня всегда возникают проблемы с Access SQL. Синтаксис требует случайного добавления скобок или перемещений вокруг, отличных от SQL Server. Кто-нибудь знает, что может быть синтаксическая ошибка здесь? Ошибка фокусируется вокруг предложения FROM. Я знаю, что другие предложения в порядке, но я оставил их для справки.Ошибка синтаксиса в Access SQL View

Обновление: Упрощенный код намного больше. Меня в основном беспокоят положения 3 FROM.

SELECT 

    ... 

FROM 

    (((maintable 

    INNER JOIN othertable ON (maintable.A = othertable.A) AND (maintable.B = othertable.B)) 

    INNER JOIN 

     (SELECT 

      ... 

     FROM 

      (thirdtable) 
      INNER JOIN fourthtable ON thirdtable.blah = fourthtable.blah 

     WHERE 

      fourthtable.something <> 1 

     GROUP BY 

      ... 

     ) AS innerselect1 ON (othertable.item = innerselect1.item) AND (othertable.whse = innerselect1.whse)) AS table1) 

    JOIN (

      SELECT ... 
      FROM (othertable INNER JOIN maintable ON othertable.item = maintable.item) 
      GROUP BY ... 
      HAVING ... 

     ) AS table2 ON table1.item = table2.item 

WHERE 

    ... 

GROUP BY 

    ... 

HAVING 

    ... 

UNION ALL 

SELECT 

    ... 

FROM 

    (((maintable 

    INNER JOIN othertable ON (maintable.A = othertable.A) AND (maintable.B = othertable.B)) 

    INNER JOIN 

     (SELECT 

      ... 

     FROM 

      (thirdtable) 
      INNER JOIN fourthtable ON thirdtable.blah = fourthtable.blah 

     WHERE 

      fourthtable.something <> 1 

     GROUP BY 

      ... 

     ) AS innerselect1 ON (othertable.item = innerselect1.item) AND (othertable.whse = innerselect1.whse)) AS table1) 

    LEFT JOIN (

      SELECT ... 
      FROM (othertable INNER JOIN maintable ON othertable.item = maintable.item) 
      GROUP BY ... 
      HAVING ... 

     ) AS table2 ON table1.item = table2.item 

WHERE 

    table2.item IS NULL 

GROUP BY 

    ... 

HAVING 

    ... 

UNION ALL 

SELECT 

    ... 

FROM 

    (((maintable 

    INNER JOIN othertable ON (maintable.A = othertable.A) AND (maintable.B = othertable.B)) 

    INNER JOIN 

     (SELECT 

      ... 

     FROM 

      (thirdtable) 
      INNER JOIN fourthtable ON thirdtable.blah = fourthtable.blah 

     WHERE 

      fourthtable.something <> 1 

     GROUP BY 

      ... 

     ) AS innerselect1 ON (othertable.item = innerselect1.item) AND (othertable.whse = innerselect1.whse)) AS table1) 

    RIGHT JOIN (

      SELECT ... 
      FROM (othertable INNER JOIN maintable ON othertable.item = maintable.item) 
      GROUP BY ... 
      HAVING ... 

     ) AS table2 ON table1.item = table2.item 

WHERE 

    table1.item IS NULL 

GROUP BY 

    ... 

HAVING 

    ... 
; 
+0

Доступ может соединяться только с двумя таблицами в то время. Вам нужно много круглых скобок. – jarlh

+0

Интересно, я этого не знал. – whatwhatwhat

ответ

1

FULL OUTER JOIN не поддерживается в Access SQL.

Для обходных решений см., Например, How do I write a full outer join query in access

или https://stackoverflow.com/search?tab=relevance&q=%5bms-access%5d%20FULL%20OUTER%20JOIN: р

+0

Есть ли эквивалент доступа, соединяющий 2 таблицы в одном поле и возвращающие строки, где поля не совпадают? – whatwhatwhat

2

код [SQL Access] синтаксис требует случайно добавления скобок

Это не случайно. (Я предполагаю, что вы неправильно употребляете слово «случайный» во многом таким же образом, что люди злоупотребляют словом «буквально».)

Доступ к SQL обычно требует скобок при использовании нескольких условий JOIN. То есть, это, как правило, жалуются на конструктов, как это:

SELECT ... 
FROM 
    tbl1 
    INNER JOIN tbl2 ON tbl1.fld = tbl2.fld1 
    INNER JOIN tbl3 ON tbl2.fld = tbl3.fld2 

Вместо этого нужно круглые скобки вокруг одного из (полный) внутренних соединений. Когда я пишу SQL Access вручную, я предпочитаю использовать отступы как этот

SELECT ... 
FROM 
    (
     tbl1 
     INNER JOIN 
     tbl2 
     ON tbl1.fld = tbl2.fld1 
    ) 
    INNER JOIN 
    tbl3 
    ON tbl2.fld = tbl3.fld2 

Второй пример:

Вместо

SELECT ... 
FROM 
    tbl1 
    INNER JOIN tbl2 ON tbl1.fld = tbl2.fld1 
    INNER JOIN tbl3 ON tbl2.fld = tbl3.fld2 
    INNER JOIN tbl4 ON tbl3.fld = tbl4.fld3 

было бы больше похоже

SELECT ... 
FROM 
    (
     (
      tbl1 
      INNER JOIN 
      tbl2 
      ON tbl1.fld = tbl2.fld1 
     ) 
     INNER JOIN 
     tbl3 
     ON tbl2.fld = tbl3.fld2 
    ) 
    INNER JOIN 
    tbl4 
    ON tbl3.fld = tbl4.fld3 
+0

Что делать, если у меня есть 2 'INNER JOIN' и' LEFT JOIN'? – whatwhatwhat

+0

Затем вы просто помещаете одну пару круглых скобок вокруг JOIN, которую хотите выполнить сначала, и этот результат будет подключен к третьей таблице. –

+0

Я немного смущен. Вы имеете в виду 'FROM (tbl1 INNER JOIN tbl2 ON ... INNER JOIN tbl3) ON ... LEFT JOIN tbl4 ON ...' или вы имеете в виду 'FROM ((tbl1 INNER JOIN tbl2 ON ...) INNER JOIN tbl3) ON ... LEFT JOIN tbl4 ON ... '? – whatwhatwhat

Смежные вопросы