Ошибка запроса: ошибка: ER_PARSE_ERROR: у вас есть ошибка в вашем синтаксисе SQL;проверьте руководство, которое соответствует вашему MySQL - PullRequest
0 голосов
/ 05 февраля 2019

Я пытаюсь объединить две таблицы с запросом ниже.

(SELECT CustomerName, OrderDate,
LAG(OrderDate,1) OVER(ORDER BY OrderDate DESC) as Previous_Order_Date
FROM Table1) as t1
INNER JOIN  (SELECT CustomerName, MAX(OrderDate) as Latest_Order_date
             FROM Table1
             GROUP BY CustomerName) as t2
ON t1.CustomerName = t2.CustomerName AND t1.OrderDate = t2.Latest_Order_date

Но я получаю ошибку ниже:

Ошибка запроса: Ошибка: ER_PARSE_ERROR: у вас есть ошибка вваш синтаксис SQL;проверьте руководство, соответствующее вашей версии сервера MySQL, на предмет правильного синтаксиса, который будет использоваться рядом с 'as t1 INNER JOIN (SELECT CustomerName, MAX (OrderDate) as Latest_Order_date' в строке 3

db-скрипка

Ответы [ 3 ]

0 голосов
/ 05 февраля 2019

Вам необходимо добавить такую ​​часть, как

SELECT t1.CustomerName, t1.Previous_Order_Date, t2.Latest_Order_date
  FROM

, для вышеуказанной части запроса:

SELECT t1.CustomerName, t1.Previous_Order_Date, t2.Latest_Order_date
  FROM (SELECT CustomerName,
               OrderDate,
               LAG(OrderDate, 1) OVER(ORDER BY OrderDate DESC) as Previous_Order_Date
          FROM Table1) as t1
 INNER JOIN (SELECT CustomerName, MAX(OrderDate) as Latest_Order_date
               FROM Table1
              GROUP BY CustomerName) as t2
    ON t1.CustomerName = t2.CustomerName
   AND t1.OrderDate = t2.Latest_Order_date
0 голосов
/ 05 февраля 2019

У вас нет основного оператора select.

Попробуйте что-то вроде:

SELECT *
FROM (SELECT CustomerName, OrderDate,
LAG(OrderDate,1) OVER(ORDER BY OrderDate DESC) as Previous_Order_Date
FROM Table1) as t1
INNER JOIN  (SELECT CustomerName, MAX(OrderDate) as Latest_Order_date
             FROM Table1
             GROUP BY CustomerName) as t2
ON t1.CustomerName = t2.CustomerName AND t1.OrderDate = t2.Latest_Order_date

Для выбора MySQL требуется запрос в формате:

SELECT *
FROM table1 AS t1
JOIN table2 AS t2
  ON t1.id = t2.id
JOIN (SELECT id, value FROM table3) as t3
  on t3.id = t2.id
WHERE t3.value IS NOT NULL;
0 голосов
/ 05 февраля 2019

У вас отсутствует внешнее предложение select:

SELECT
    t1.CustomerName,
    t1.Previous_Order_Date,
    t2.Latest_Order_date
FROM
(
    SELECT CustomerName, OrderDate,
        LAG(OrderDate,1) OVER(ORDER BY OrderDate DESC) AS Previous_Order_Date
    FROM Table1
) AS t1
INNER JOIN
(
    SELECT CustomerName, MAX(OrderDate) AS Latest_Order_date
    FROM Table1
    GROUP BY CustomerName
) AS t2
    ON t1.CustomerName = t2.CustomerName AND t1.OrderDate = t2.Latest_Order_date;

Но на самом деле вы могли бы иметь возможность упростить ваш запрос, даже не используя никаких объединений:

SELECT
    t.CustomerName,
    t.Previous_Order_Date,
    t.Latest_Order_date
FROM
(
    SELECT CustomerName, OrderDate,
        LAG(OrderDate,1) OVER(ORDER BY OrderDate DESC) AS Previous_Order_Date,
        MAX(OrderDate) OVER (PARTITION BY CustomerName) AS Latest_Order_date
    FROM Table1
) t
WHERE
    t.Previous_Order_Date = t.Latest_Order_date;

Это было бы правильно, если бы каждая строка, прошедшая в вашем объединении, соответствовала одной-единственной записи.

Обратите внимание, что ваш текущий синтаксис действительно будет действителен в MySQL, если между подзапросами будет UNION вместоприсоединиться.То есть следующий допустимый синтаксис:

(SELECT CustomerName, OrderDate FROM Table1)
UNION
(SELECT CustomerName, OrderDate FROM Table1)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...