2009-10-23 92 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