Проверьте руководство, соответствует ли ваша версия сервера MariaDB для правильного использования синтаксиса - PullRequest
1 голос
/ 06 марта 2020

Я пытаюсь создать синтаксис sql:

UPDATE `%s`
JOIN (WITH t2 AS
(
SELECT LAG(storymain_id,1) OVER (ORDER BY storymain_id) AS lg, `%s`.* 
FROM `%s`
)
SELECT t2.*,
1 + SUM(CASE WHEN COALESCE(lg,storymain_id) = storymain_id THEN 0 ELSE 1 END ) 
OVER (ORDER BY storymain_id) AS new_id
FROM t2 ) t2
ON `%s`.storymain_id = t2.storymain_id SET `%s`.storymain_id = t2.new_id;

на моем сервере maria-db, версия которого:

mysql  Ver 15.1 Distrib 10.1.44-MariaDB, for debian-linux-gnu (x86_64) using readline 5.2

Я получил ошибку, когда запустите его:

SQLSTATE[42000]:
Syntax error or access violation: 1064 You have an error in your SQL syntax; check the manual that 
corresponds to your MariaDB Server version for the right syntax to use near 't2 AS\r\n\t\t\t\t 
(\r\n\t\t\t\t\tSELECT LAG(storymain_id, 1) OVER (ORDER BY storymain_id) AS' at line ~.

Мне нужно заставить его работать, но я не знаю, как изменить синтаксис ..

Спасибо за вашу помощь ...

1 Ответ

1 голос
/ 06 марта 2020

Я бы просто заменил cte на обычную производную таблицу. Вы не используете cte только один раз в запросе, так что это на самом деле не имеет значения:

update `%s`
join (
    select 
        t2.*,
        1 + sum(case when coalesce(lg,storymain_id) = storymain_id then 0 else 1 end) 
            over (order by storymain_id) as new_id
    from (
        select 
            lag(storymain_id,1) over (order by storymain_id) as lg, 
            `%s`.* 
        from `%s`
    ) t2
) t2
on `%s`.storymain_id = t2.storymain_id 
set `%s`.storymain_id = t2.new_id;

В противном случае MySQL хочет получить предложение with в начале o оператора:

with t2 as (
    select 
        lag(storymain_id,1) over (order by storymain_id) as lg, 
        `%s`.* 
    from `%s`
)
update `%s`
join (
    select 
        t2.*,
        1 + sum(case when coalesce(lg,storymain_id) = storymain_id then 0 else 1 end) 
            over (order by storymain_id) as new_id
    from t2
) t
on `%s`.storymain_id = t.storymain_id 
set `%s`.storymain_id = t.new_id;

Ссылка :

Предложение WITH допускается в следующих контекстах:

  • В начале операторов SELECT, UPDATE и DELETE.

    WITH ... SELECT ...

    WITH ... UPDATE ...

    WITH ... DELETE ...

...