Объявленные переменные сбрасываются в операторе select - PullRequest
0 голосов
/ 25 сентября 2019

Я пытаюсь воссоздать запрос из базы данных mysql в базу данных h2, но получаю противоречивые результаты.

Запрос

SELECT
    enrolmentid,
    @prev,
    questionid,
    @thisrow:= (
        CASE WHEN @prev = enrolmentid THEN
            @thisrow
        ELSE
            0
        END) + 1 AS row_num,
    @prev:= enrolmentid
FROM
    response,
    (SELECT @thisrow:= 0, @prev:= NULL) r
WHERE
    enrolmentid = 18620674
ORDER BY
    enrolmentid,
    questionid

Структура таблицы

CREATE TABLE `enrolment` (
  `enrolmentid` bigint(20) NOT NULL,
  `batch_reference` varchar(128) DEFAULT NULL,
  `destination` varchar(255) DEFAULT NULL,
  `enrolment_date` datetime DEFAULT NULL,
  `enrolment_reference` varchar(128) DEFAULT NULL,
  `response_report_id` bigint(20) DEFAULT NULL,
  PRIMARY KEY (`enrolmentid`),
  KEY `FK9ueb1l045x7ignakryx64deir` (`response_report_id`)
);

Использование MySQLrow_num корректно увеличивается:

enrolmentid,@prev,questionid,row_num,@prev:= enrolmentid
18620674,NULL,33909,1,18620674
18620674,18620674,33910,2,18620674
18620674,18620674,33911,3,18620674

Но H2, кажется, сбрасывает переменные для каждой строки

ENROLMENTID,@PREV,QUESTIONID,ROW_NUM,"SET(@PREV, ENROLMENTID)"
18620674,NULL,33909,1,18620674
18620674,NULL,33910,1,18620674
18620674,NULL,33911,1,18620674

Кто-нибудь знает о последовательном способе достижения этого между MySQL и H2?Большое спасибо заранее

1 Ответ

0 голосов
/ 25 сентября 2019

Использование переменных сеанса внутри списка выбора приводит к неопределенным результатам в H2, поскольку строки могут оцениваться в любом порядке.

Если вы используете современные версии MySQL и H2, вы можете использовать ROW_NUMBER() OVER (PARTITION BY enrolmentid ORDER BY questionid) вместотакое сложное и ненадежное выражение.

SELECT
    enrolmentid,
    questionid,
    ROW_NUMBER() OVER (PARTITION BY enrolmentid ORDER BY questionid)
FROM
    response
WHERE
    enrolmentid = 18620674
ORDER BY
    enrolmentid,
    questionid

Если ваше условие WHERE всегда содержит только один enrolmentid, предложение PARTITION BY не требуется, ROW_NUMBER() OVER(ORDER BY questionid) будет достаточно.

...