SQL - Consulta muuuy dificil: ¿alguien se atreve?

 
Vista:

Consulta muuuy dificil: ¿alguien se atreve?

Publicado por Sergio (2 intervenciones) el 15/06/2005 18:32:55
Hola a todos!!,

Tengo que conseguir realizar una consulta en SQL Server bastante dificil y hasta ahora no lo he conseguido.

Objetivo:
Dada una cadena que indica quien va a servir una orden , llamémosla 'clerk', hay que localizar la orden más antigua (a través del campo TimePlaced) de la tabla Orders y actualizar el campo ServedBy con dicha cadena.

Tabla Orders:
OrderId : varchar
....
TimePlaced: datetime
ServedBy : varchar

RESTRICCIÓN MUY IMPORTANTE: Por asuntos de concurrencia es necesario realizar dicha consulta de forma atómica, es decir, usando una única consulta del tipo
select .... into

Habrá que usar una tabla auxiliar , llamémosla 'Served', con lo que la cosa queda así:

Tabla Orders:
OrderId : varchar
....
TimePlaced: datetime
ServedBy : varchar

Tabla Served
OrderId: varchar
ServedBy:varchar


OBJETIVO FINAL: Buscar la orden más antigua de la tabla Orders tal que su OrderId no se encuentre en la tabla Served, e insertar dicho OrderId en la tabla Served de forma atómica.

¿Alguien se atreve?

Muchas gracias por adelantado!!
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:Consulta muuuy dificil: ¿alguien se atreve?

Publicado por edu (36 intervenciones) el 15/06/2005 18:46:21
ta que ta recontra facil, a eso le llamas dificil??? te lo mando por correo, dentro de un rato, ya que ahorita estoy haciendo cosas mas dificiles, ahi hablamos.
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
sin imagen de perfil

RE:Consulta muuuy dificil: ¿alguien se atreve?

Publicado por Liliana (426 intervenciones) el 15/06/2005 20:09:19
Hola Sergio,
Asumo que además de insertar la información en la tabla Served, tendrás que actualizar Orders, como también que en TimePlaced tenés fecha y hora, espero que te sirva o que puedas adaptarlo a tus necesidades:

CREATE PROC #Atender
(@servidor varchar(10))
AS

BEGIN TRANSACTION
DECLARE @TimePlaced DATETIME, @OrderID VARCHAR(10)

SELECT @TimePlaced = MIN (TimePlaced)
FROM #Orders
WHERE ServedBy = ' '

SELECT @OrderID = OrderID
FROM #Orders
WHERE ServedBy = ' ' AND TimePlaced = @TimePlaced

-- Actualiza Orders
UPDATE #Orders
SET Servedby = @servidor
WHERE OrderId = @OrderID

IF @@ERROR <> 0
BEGIN
ROLLBACK TRAN
RETURN
END

-- Inserta en Served
INSERT #Served
SELECT @OrderId, @servidor

IF @@ERROR <> 0
BEGIN
ROLLBACK TRAN
RETURN
END

COMMIT TRAN
GO
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:Consulta muuuy dificil: ¿alguien se atreve?

Publicado por Sergio (2 intervenciones) el 15/06/2005 20:24:03
Siento no haberlo dicho antes, pero el problema de todo esto
es que hay que hacerlo mediante jdbc desde java, es decir, mediante una sóla instrucción del tipo SELECT ... INTO.

Todo esto va destinado a la realización de un framework de protocolos de contienda para cuando haya problemas de acceso concurrente a la BD. De forma que la busqueda de la orden más antigua y la actualización de su campo SevedBy se deben hacer de forma atómica.

Con java es algo del tipo:
stmt =getConnection().prepareStatement( "select into");

Lo que os comento en el mensaje son los requisitos a los que hemos llegado mis compañeros y yo.

De todas formas, miraré vuestros script con lupa y MUCHÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍSIMAS GRACIAS!!


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