Access SQL выражение соединения не поддерживается - PullRequest
0 голосов
/ 05 октября 2018

Я использую доступ для запуска запроса, но он говорит, что операция соединения не поддерживается.Я проверил синтаксис, и, кажется, хорошо.Может кто-нибудь, пожалуйста, помогите мне понять, почему это не удается:

SELECT
   d.uid,
   md_20180901.monthval,
   md_20180801.monthval,
   md_20180701.val 
FROM
   (
(data as d 
      LEFT JOIN
         (
            SELECT
               md.* 
            FROM
               monthdata md 
            WHERE
               md.monthval = #01/09/2018# 
         )
         as md_20180901 
         ON d.UID = md_20180901.dataUID 
         AND md_20180901.monthval = #01/09/2018# ) 
      LEFT JOIN
         (
            SELECT
               md.* 
            FROM
               monthdata md 
            WHERE
               md.monthval = #01/08/2018# 
         )
         as md_20180801 
         ON d.UID = md_20180801.dataUID 
         AND md_20180801.monthval = #01/08/2018#
   )
   LEFT JOIN
      (
         SELECT
            md.* 
         FROM
            monthdata md 
         WHERE
            md.monthval = #01/07/2018# 
      )
      as md_20180701 
      ON d.UID = md_20180701.dataUID 
      AND md_20180701.monthval = #01/07/2018#
WHERE
   d.UID = "5B51141D";

Для контекста, это мои таблицы

данные таблица

ID
UID
MYNAME

monthdata таблица

ID
DATAUID
MONTHVAL
VAL

Ответы [ 2 ]

0 голосов
/ 05 октября 2018

Начните с удаления всех ненужных частей и упрощения.Пример:

            SELECT
               md.* 
            FROM
               monthdata md 
            WHERE
               md.monthval = #01/09/2018# 
         )
         as md_20180901 
         ON d.UID = md_20180901.dataUID 
         AND md_20180901.monthval = #01/09/2018#

можно упростить:

(SELECT val FROM monthdata WHERE monthval=#01/09/2018#) md_20180901
ON d.UID=md_20180901.dataUID

Вам не нужно повторять имена таблиц, если нет конфликта имен полей.Вам не нужно назначать псевдонимы, которые никогда не будут использоваться (на самом деле я обычно назначаю псевдонимы только в том случае, если я использую одну и ту же таблицу дважды).Вам не нужно добавлять monthval при фильтрации на ON, поскольку вы уже делаете это в WHERE.Единственное поле, которое вы на самом деле собираете, это val (monthval фактически является фиксированным значением, поскольку вы фильтруете по определенной дате), поэтому не используйте *.

Очистите запрос и попробуйтедобавив по одному monthval за раз, посмотрим, что получится.

0 голосов
/ 05 октября 2018

Access поддерживает литералы только в выражениях соединения, когда выражение заключено в круглые скобки:

SELECT
   d.uid,
   md_20180901.monthval,
   md_20180801.monthval,
   md_20180701.val 
FROM
   (
(data as d 
      LEFT JOIN
         (
            SELECT
               md.* 
            FROM
               monthdata md 
            WHERE
               md.monthval = #01/09/2018# 
         )
         as md_20180901 
         ON (d.UID = md_20180901.dataUID 
         AND md_20180901.monthval = #01/09/2018#) ) 
      LEFT JOIN
         (
            SELECT
               md.* 
            FROM
               monthdata md 
            WHERE
               md.monthval = #01/08/2018# 
         )
         as md_20180801 
         ON (d.UID = md_20180801.dataUID 
         AND md_20180801.monthval = #01/08/2018#)
   )
   LEFT JOIN
      (
         SELECT
            md.* 
         FROM
            monthdata md 
         WHERE
            md.monthval = #01/07/2018# 
      )
      as md_20180701 
      ON (d.UID = md_20180701.dataUID 
      AND md_20180701.monthval = #01/07/2018#)
WHERE
   d.UID = "5B51141D";

Однако вы делаете здесь что-то странное.Вы также сравниваете внутри подзапросов.Удалить те:

SELECT
   d.uid,
   md_20180901.monthval,
   md_20180801.monthval,
   md_20180701.val 
FROM
(
(data as d 
      LEFT JOIN
         monthdata as md_20180901 
         ON (d.UID = md_20180901.dataUID 
         AND md_20180901.monthval = #01/09/2018#) ) 
      LEFT JOIN
         monthdata as md_20180801 
         ON (d.UID = md_20180801.dataUID 
         AND md_20180801.monthval = #01/08/2018#)
   )
   LEFT JOIN
      monthdata as md_20180701 
      ON (d.UID = md_20180701.dataUID 
      AND md_20180701.monthval = #01/07/2018#)
WHERE
   d.UID = "5B51141D";
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...