Actualización de una sola consulta SQL
-
05-07-2019 - |
Pregunta
Tengo que insertar valores en una nueva columna en nuestra base de datos, pero no puedo entender esto de una manera consistente. Hay una gran cantidad de datos, por lo que hacer cualquier cosa manualmente es prácticamente imposible. Déjame poner el escenario:
Tenemos una tabla llamada Ocurrencia y una tabla llamada OccurenceBuckets donde cada aparición hace referencia al grupo al que se le ha asignado. Anteriormente, se trataba de una referencia en un solo sentido, pero por varias razones hemos decidido agregar una referencia desde el OccurrenceBucket a la primera Ocurrencia (la primera en el tiempo, es decir). Las tablas ahora se ven así:
CREATE TABLE Occurrence
OccurrenceID uniqueidentifier,
OccurrenceBucketID uniqueidentifier,
OccurrenceTime datetime,
OccurrenceMessage nvarchar
...other meta data...
CREATE TABLE OccurrenceBucket
OccurrenceBucketID uniqueidentifier,
...other meta data...
FirstOccurrenceID uniqueidentifier,
FirstOccurrenceTime datetime,
FirstOccurrenceMessage nvarchar
Estoy buscando una manera de determinar la primera aparición que pertenece a un grupo y asignando FirstOccurrenceID, FirstOccurrenceTime y FirstOccurrenceMessage con valores de esta primera aparición para todos mis eventos de ocurrencia.
¿Alguno de ustedes, los expertos de sql-fu, tienen tiempo para ayudarme, todos mis intentos han sido producidos para producir una selección incorrecta o incompleta de las ocurrencias?
Solución
Puedes probar esto
DECLARE @Occurrence TABLE(
OccurrenceID INT,
OccurrenceBucketID INT,
OccurrenceTime DATETIME,
OccurrenceMessage VARCHAR(MAX)
)
INSERT INTO @Occurrence (OccurrenceID,OccurrenceBucketID,OccurrenceTime,OccurrenceMessage)
SELECT 1, 1, '01 Jan 2009', 'A'
INSERT INTO @Occurrence (OccurrenceID,OccurrenceBucketID,OccurrenceTime,OccurrenceMessage)
SELECT 2, 1, '02 Jan 2009', 'B'
INSERT INTO @Occurrence (OccurrenceID,OccurrenceBucketID,OccurrenceTime,OccurrenceMessage)
SELECT 3, 1, '03 Jan 2009', 'C'
INSERT INTO @Occurrence (OccurrenceID,OccurrenceBucketID,OccurrenceTime,OccurrenceMessage)
SELECT 4, 2, '04 Jan 2009', 'D'
INSERT INTO @Occurrence (OccurrenceID,OccurrenceBucketID,OccurrenceTime,OccurrenceMessage)
SELECT 5, 2, '05 Jan 2009', 'E'
INSERT INTO @Occurrence (OccurrenceID,OccurrenceBucketID,OccurrenceTime,OccurrenceMessage)
SELECT 6, 2, '06 Jan 2009', 'F'
SELECT * FROM @Occurrence
DECLARE @OccurrenceBucket TABLE(
OccurrenceBucketID INT,
FirstOccurrenceID INT,
FirstOccurrenceTime DATETIME,
FirstOccurrenceMessage VARCHAR(MAX)
)
INSERT INTO @OccurrenceBucket (OccurrenceBucketID) SELECT 1
INSERT INTO @OccurrenceBucket (OccurrenceBucketID) SELECT 2
SELECT * FROM @OccurrenceBucket
UPDATE @OccurrenceBucket
SET FirstOccurrenceID = OccurrenceID,
FirstOccurrenceTime = OccurrenceTime,
FirstOccurrenceMessage = OccurrenceMessage
FROM @OccurrenceBucket oc INNER JOIN
(
SELECT o.*
FROM @Occurrence o INNER JOIN
(
SELECT OccurrenceBucketID,
MIN(OccurrenceID) FirstOccurrenceID
FROM @Occurrence
GROUP BY OccurrenceBucketID
) Mins ON o.OccurrenceID = mins.FirstOccurrenceID
) Vals ON oc.OccurrenceBucketID = Vals.OccurrenceBucketID
SELECT * FROM @OccurrenceBucket
EDITAR:
UPDATE @OccurrenceBucket
SET FirstOccurrenceID = OccurrenceID,
FirstOccurrenceTime = OccurrenceTime,
FirstOccurrenceMessage = OccurrenceMessage
FROM @OccurrenceBucket oc INNER JOIN
(
SELECT o.*
FROM @Occurrence o INNER JOIN
(
SELECT OccurrenceBucketID,
MIN(OccurrenceTime) FirstOccurrenceTime
FROM @Occurrence
GROUP BY OccurrenceBucketID
) Mins ON o.OccurrenceTime = mins.FirstOccurrenceTime
) Vals ON oc.OccurrenceBucketID = Vals.OccurrenceBucketID
Otros consejos
Bueno, para encontrar la primera aparición en un cubo, ¿no debería funcionar lo siguiente?
SELECT TOP 1
OccurranceID, OccurranceTime, OccurranceMessage
FROM Occurance
WHERE
OccurranceBucketID = @OccurranceBucketID
ORDER BY
OccurranceTime ASC
Puede asignar los campos devueltos a las variables y luego actualizar su OccurranceBucket en consecuencia.
NB: " ocurrencia " no tiene " a " en ella.
Esta respuesta se basa en que OccurrenceTime es único para cada aparición: -
actualizar OccBuck set
OccBuck.FirstOccurrenceID = Occ.OccurrenceID,
OccBuck.FirstOccurrenceTime = Occ.OccurrenceTime,
OccBuck.FirstOccurrenceMessage = Occ.OccurrenceMessage
de
dbo.OccurrenceBucket como OccBuck
internal join dbo.Occurrence as Occ en OccBuck.OccurrenceBucketID = Occ.OccurrenceBucketID
unión interna (seleccione OccurrenceBucketID,
MIN (OccurrenceTime) como 'MinOccurrenceTime'
de dbo.Occurrence
group by OccurrenceBucketID) como minOcc en Occ.OccurrenceBucketID = minOcc.OccurrenceBucketID y
Occ.OccurrenceTime = minOcc.MinOccurrenceTime