SQL Server - Seleccionar el ultimo Registro SIN usar Indice

 
Vista:

Seleccionar el ultimo Registro SIN usar Indice

Publicado por LearningDavid (2 intervenciones) el 11/06/2008 18:07:58
Saludos! Tengo una duda acerca de una búsqueda hecha en mssql (2005) espero me puedan ayudar. Gracias de antemano!

Tengo una tabla llamada tblMovimientos, con tres campos: lote, cuenta, monto
No existe un indice o llave en la tabla, sin campos consecutivos

El campo "lote" puede contener el mismo valor en varios registros
El campo "cuenta" es irrelevante
El campo "monto" muiestra una cifra monetaria

Necesito hace una busqueda que me mustre el Ultimo Registro de todos los que tengan el valor Igual en "lote"

por ejemplo ej:
lote cuenta monto
1 cuenta1 3.00
1 cuenta2 2.15
1 cuenta3 3.50 <--- Este
2 cuenta2 4.00
2 cuenta2 2.20
2 cuenta2 3.50
2 cuenta3 4.00 <---este
3 cuenta3 8.40
3 cuenta3 4.10<--- este
4 cuenta3 3.30
4 cuenta2 6.70 <---este
5 cuenta3 8.10
5 cuenta3 6.25
5 cuenta1 6.90 <--- este
6 cuenta2 8.00 <--- este
7 cuenta1 3.10
7 cuenta2 8.20
7 cuenta3 19.00 <--- y este

Como ven no tiene indice ni consecutivos, busque algo de informacion a cerca de como crear indices y despues borrarlos, ya sea primarios o no primarios, pero no se si esta sea la manera mas optima o si exista una sentencia que me ayude a hacer esto, no la he podido encontrar. No debo modificar la estructura de la tabla permanentemente.

Muchas Gracias
David
Valora esta pregunta
Me gusta: Está pregunta es útil y esta claraNo me gusta: Está pregunta no esta clara o no es útil
0
Responder

RE:Seleccionar el ultimo Registro SIN usar Indice

Publicado por Isaias (3308 intervenciones) el 12/06/2008 19:13:25
David, es un ERROR no utilizar indices en las tablas, eso hacen lentas las busquedas.

Aun con su ejemplo, no se entiende

"Ultimo Registro de todos los que tengan el valor Igual en "lote" "

¿Que es realmente lo que busca?
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

RE:Seleccionar el ultimo Registro SIN usar Indice

Publicado por Hector Perez (5 intervenciones) el 13/06/2008 21:04:51
ok, yo si entendi tu duda, pero coincido con isaias, es pesima practica crear tablas sin llaves, como pretenderias realizar una busqueda en esa tabla, acaso por el ultimo registro insertado?, lo dudo mucho,1 por el tiempo que tardar en encontrarlo y 2 por que no es funcional; asi que te recomendaria le agregaras una llave a tu tabla o alguna forma de identificar los registros, no se un constraint de algo, que vaya de acuerdo a tus necesidades.

en fin, te pongo un script que hace lo que deseas, solo que no funcionaria si se ordena la tabla, esto por que para obtener el ultimo registro requieres que te traiga los datos tal cual como se fueron insertando los registros en las paginas de la tabla y digamos que "virtualmente" estariamos hablando del ultimo registro, si esto es a lo que te refieres

CREATE TABLE #TMP1(indTBL INT IDENTITY NOT NULL,
ShipName VARCHAR(1000),
ShipAddress VARCHAR(1000),
ShipCity VARCHAR(1000),
ExtendedPrice DECIMAL)

INSERT INTO #TMP1
SELECT ShipName,ShipAddress,ShipCity,ExtendedPrice
FROM Invoices
WHERE ShipName = 'Vins et alcools Chevalier'
AND ShipAddress LIKE '59 rue de l%'
AND ShipCity = 'Reims'

DECLARE @ultimoReg INT
--Obtengo el ultimo registro
SELECT @ultimoReg = MAX(indTBL) FROM #TMP1

SELECT * FROM #TMP1
WHERE indTBL = @ultimoReg

DROP TABLE #TMP1

Saludos!
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

RE:Seleccionar el ultimo Registro SIN usar Indice

Publicado por LearningDavid (2 intervenciones) el 16/06/2008 01:07:10
Hey Muchas Gracias Hector e Isaias!

Coincido con ustedes! Es un error manejar tablas sin indice, pero desafortunadamente yo no hice la base de datos. Como ustedes sabran a veces nos toca trabajar sobre algo que no hicimos y mas que nada sin documentacion alguna.

Les agradezco la ayuda, y les comento que ya pude hacer la búsqueda, ademas de enviar los datos requeridos a otra tabla.

Previamente agregué un campo mas a la tabla, llamado <indice>. Agrupé los registros por el campo <lote>. Y de esa agrupacion seleccioné el ultimo. Y los ordene por <lote>.

Lo hice directamente sobre mssql en un query:

select a.* into tblTempEnero from tblEnero a inner join
(
select Lote, max(indice) indice
from tblEnero
group by lote
--order by max(indice), lote
) b ON a.lote = b.lote and a.indice = b.indice
order by a.lote

Saludos!
David
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

RE:Seleccionar el ultimo Registro SIN usar Indice

Publicado por Shanefree (1 intervención) el 28/11/2011 21:14:15
Gracias! buen aporte =)
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar