문제
데이터베이스의 새 열에 값을 삽입해야하지만 일관된 방식 으로이 작업을 수행 할 수는 없습니다. 많은 데이터가 있으므로 수동으로 작업을 수행하는 것이 거의 문제가되지 않습니다. 무대를 설정하겠습니다.
우리는 발생이라는 테이블과 ExeenceBuckets라는 테이블을 가지고 있으며, 각 발생은 할당 된 버킷을 참조합니다. 이전에는 일방 통행 참조 였지만 여러 가지 이유로 우리는 발생 주름에서 첫 번째 발생 (첫 번째 시간, 즉)까지 참조를 추가하기로 결정했습니다. 테이블은 이제 다음과 같습니다.
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
나는 버킷에 속하는 첫 번째 발생을 결정하고 모든 발생 주름에 대한 첫 번째 발생의 값으로 첫 번째 발생, FirstEccurrenceTime 및 FirstEccurrenCessage를 할당하는 방법을 찾고 있습니다.
SQL-FU 전문가 중 누구라도 저를 도울 시간이 있습니다. 모든 시도가 잘못되었거나 불완전한 선택을 생산하려는 모든 시도가 있습니다.
해결책
당신은 이것을 시도 할 수 있습니다
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
편집하다:
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
다른 팁
글쎄, 양동이에서 첫 번째 사건을 찾으려면 다음과 같은 작동하지 않아야합니까?
SELECT TOP 1
OccurranceID, OccurranceTime, OccurranceMessage
FROM Occurance
WHERE
OccurranceBucketID = @OccurranceBucketID
ORDER BY
OccurranceTime ASC
반환 된 필드를 변수에 할당 한 다음 그에 따라 발생한 사건을 업데이트 할 수 있습니다.
NB : "발생"에는 "A"가 없습니다.
이 답변은 발생하는 경우 각 발생에 대해 고유 한 사건에 의존합니다.
Occbuck 세트 업데이트
Occbuck.firstoccurrenceid = Occ.occurrenceId,
Occbuck.firstoccurrencetime = Occ.occurrencetime,
Occbuck.firstoccurrencemessage = Occ.occurrencemessage
~에서
Occbuck로서 DBO.OccurenceBucket
내부 조인 DBO. Occbuck.occurenceBucketid = Occ.OccurrenceBucketId에서 OCC로 OCC
내부 조인
'minoccurrencetime'으로서의 최소 (발생)
DBO에서
Occ.occurencebucketid = minocc.occurrencebucketid의 minocc로서 rupurrencebucketid).
Occ.occurrencetime = minocc.minoccurrencetime