SELECT *
FROM SameLogTable
WHERE ID_Table IN (SELECT ID_Table-1
FROM SameLogTable
WHERE <SameCondition>) OR
ID_Table IN (SELECT ID_Table
FROM SameLogTable
WHERE <SameCondition>) OR
ID_Table IN (SELECT ID_Table+1
FROM SameLogTable
WHERE <SameCondition>)
Esta consulta é executada em uma tabela de registro e desejo selecionar eventos específicos, mas também o evento anterior e posterior a esses eventos. Esta solução parece feia e ineficiente, qual seria a melhor maneira de escrever isso?
Exemplo: Se estou interessado em linhas com ID 4 e 23 de uma LogTable, quero obter o seguinte resultado:
ID Column1 Column2 ...
3 ... ...
4 ... ...
5 ... ...
22 ... ...
23 ... ...
24 ... ...
Estas são todas as linhas da Same LogTable, exceto que eu especifico as linhas 4 e 23 usando WHERE , e quero que Select retorne automaticamente as linhas 3,5 para 4 e as linhas 22, 24 para 23.
Para resumir os resultados:
MyQuery: 16s
UNION ALL: 4s
Join: ~0s
Obrigado pelas respostas!
Supondo que
ID
seja a chave primária da tabela (ou tenha uma restrição única), você pode usar esta variante:Nota: se houver
id
lacunas, o que é muito provável, o acima não funcionará como esperado e nem sua consulta original.ROW_NUMBER()
pode te ajudar nisso:A solução é usar um
UNION ALL
para que você precise apenas de uma única subconsulta: