假设我有一张带有荷兰语或英语字母表的桌子。
阿尔法贝特
digit
--------
a
b
c
d
e
f
g
h
i
j
k
l
m
n
o
p
q
r
s
t
x
y
z
现在我想显示这样的列表。
digit next_digit next_two_digit
------ ---------- ----------------
a b c
b c d
c d e
d e f
e f g
f g h
g h i
h i j
i j k
j k l
k l m
l m n
m n o
n o p
o p q
p q r
q r s
r s t
s t x
t x y
x y z
y z (NULL)
z (NULL) (NULL)
在 Oracle(以及更多支持窗口函数的数据库)中,您可以使用以下命令获取此列表
SELECT
"digit"
, LEAD("digit", 1) OVER (ORDER BY "digit" ASC) as next_digit
, LEAD("digit", 2) OVER (ORDER BY "digit" ASC) as next_two_digits
FROM
alfabet
ORDER BY
"digit" asc
演示http://www.sqlfiddle.com/#!4/a11f1/4
现在我想在MySQL中模拟窗口函数lead(1)和lead(2)。
现在在 MySQL 中,我知道我可以通过像这样的相关子查询得到相同的结果。
SELECT
*
, (SELECT
*
FROM
alfabet alfabetInner
WHERE
alfabetInner.digit > alfabet.digit
ORDER BY
digit ASC
LIMIT 0, 1
) AS next_digit
, (SELECT
*
FROM
alfabet alfabetInner
WHERE
alfabetInner.digit > alfabet.digit
ORDER BY
digit ASC
LIMIT 1, 1
) AS next_two_digit
FROM
alfabet
ORDER BY
alfabet.digit ASC
编辑因为来自埃文卡罗尔的评论
为什么表 Alfabet 不只存储 id/行号?
因为我想模拟一个纯 LEAD(1) 或 LEAD(2) 解决方案,而不必需要一个没有间隙的自动递增序列作为 PRIMARY ID...Oracle 关闭的窗口函数也不会使用自动递增 PRIMARY 键做任何事情。
演示http://www.sqlfiddle.com/#!9/6a8701/2
现在的问题。你知道更多(有效的)LEAD 模拟方法吗?
id+1 = id
在 MySQL 中看起来像这样,
你甚至可以让这更简单