在 select 语句中重置声明的变量
Declared variables are reset in select statement
我正在尝试重新创建从 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
Table结构
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`)
);
使用 MySQL row_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 之间实现此目的的一致方法?非常感谢
在 select 列表中使用会话变量会导致 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)
就足够了。
我正在尝试重新创建从 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
Table结构
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`)
);
使用 MySQL row_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 之间实现此目的的一致方法?非常感谢
在 select 列表中使用会话变量会导致 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)
就足够了。