Suponha que eu tenha uma mesa com o alfabeto holandês ou inglês.
Alfabeto
digit
--------
a
b
c
d
e
f
g
h
i
j
k
l
m
n
o
p
q
r
s
t
x
y
z
Agora eu quero exibir uma lista como esta.
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)
No Oracle (e mais bancos de dados que suportam funções de janela) você pode obter esta lista com
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
demonstração http://www.sqlfiddle.com/#!4/a11f1/4
Agora eu quero simular a função de janela lead(1) e lead(2) no MySQL.
Agora no MySQL eu sei que posso obter o mesmo com subconsultas co-relacionadas assim.
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
Editado por causa do comentário de Evan Carroll
por que a tabela Alfabet não armazena apenas o número de identificação/linha nela?
Porque eu queria simular uma solução LEAD(1) ou LEAD(2) pura sem precisar de uma sequência de incremento automático sem lacunas como ID PRIMARY ... a função de janela do Oracle não faz nada com uma chave PRIMARY de incremento automático também.
demonstração http://www.sqlfiddle.com/#!9/6a8701/2
Agora a pergunta. Você conhece ainda mais métodos de simulação LEAD (eficazes)?
id+1 = id
Isso se parece com isso no MySQL ,
Você pode até tornar isso mais simples com