문제

데이터베이스의 새 열에 값을 삽입해야하지만 일관된 방식 으로이 작업을 수행 할 수는 없습니다. 많은 데이터가 있으므로 수동으로 작업을 수행하는 것이 거의 문제가되지 않습니다. 무대를 설정하겠습니다.

우리는 발생이라는 테이블과 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

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top