2009-10-23 133 views
1

我不得不將值插入數據庫中的新列,但我無法讓我的頭以一致的方式執行此操作。有很多數據,所以手動做任何事情都是不可能的。讓我設置階段:SQL單個查詢更新

我們有一個名爲Occurrence的表格和一個名爲OccurenceBuckets的表格,其中每個出現處都引用它已分配到的存儲區。以前這是一個單向參考,但由於各種原因,我們決定從OccurrenceBucket向第一個Occurrence添加一個參考(首先是時間,即是)。該表現在這個樣子:

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 

我正在尋找一種方法來確定屬於桶中的第一次出現,並從這個第一次出現爲我所有occurrencebuckets與價值分配FirstOccurrenceID,FirstOccurrenceTime和FirstOccurrenceMessage。

你們中的任何一位sql-fu專家都有時間來幫助我,我所有的嘗試都會產生錯誤或不完整的事件選擇。

回答

1

你可以試試這個

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 
+0

感謝您的意見。不幸的是,我們對ID使用uniqueidentifers,所以MIN(OccurrenceID)不起作用。你有另一種方式來執行選擇? –

+0

更改了解決方案,使用OccurenceTime –

1

那麼,要找到一個桶中的第一個發生不應該以下工作?

SELECT TOP 1 
    OccurranceID, OccurranceTime, OccurranceMessage 
FROM Occurance 
WHERE 
    OccurranceBucketID = @OccurranceBucketID 
ORDER BY 
    OccurranceTime ASC 

您可以將返回的字段分配給變量,然後相應地更新您的OccurranceBucket。

注意:「發生」在其中沒有「a」。

0

這個答案依賴於OccurrenceTime是每次出現獨特: -

更新OccBuck設置
OccBuck.FirstOccurrenceID = Occ.OccurrenceID,
OccBuck.FirstOc currenceTime = Occ.OccurrenceTime,
OccBuck.FirstOccurrenceMessage = Occ.OccurrenceMessage

dbo.OccurrenceBucket作爲OccBuck
內部聯接dbo.Occurrence作爲舊瓦楞紙箱上OccBuck.OccurrenceBucketID = Occ.OccurrenceBucketID
內部聯接(選擇OccurrenceBucketID,
MIN(OccurrenceTime)作爲Occ.OccurrenceBucketID = minOcc.OccurrenceBucketID和
Occ.OccurrenceTime = minOcc.MinOccurre通過OccurrenceBucketID 'MinOccurrenceTime'
從dbo.Occurrence
基)作爲minOcc nceTime