【问题标题】:SQL single query updateSQL单查询更新
【发布时间】:2009-10-23 07:10:17
【问题描述】:

我不得不将值插入到我们数据库中的新列中,但我无法以一致的方式进行此操作。有很多数据,所以手动做任何事情几乎是不可能的。让我来设置舞台:

我们有一个名为 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

我正在寻找一种方法来确定属于存储桶的第一次出现,并为我的所有出现桶分配 FirstOccurrenceID、FirstOccurrenceTime 和 FirstOccurrenceMessage 的值。

你们中的任何 sql-fu 专家有时间帮助我吗,我的所有尝试都被视为产生不正确或不完整的事件选择。

【问题讨论】:

    标签: sql tsql sql-update


    【解决方案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 
    

    【讨论】:

    • 感谢您的意见。不幸的是,我们使用唯一标识符作为 ID,因此 MIN(OccurrenceID) 不起作用。你有其他方法来执行选择吗?
    • 改变了解决方案,使用OccurenceTime
    【解决方案2】:

    那么,要找到存储桶中的第一个匹配项,不应该执行以下操作吗?

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

    您可以将返回的字段分配给变量,然后相应地更新您的 OccurranceBucket。

    注意:“occurrence”中没有“a”。

    【讨论】:

      【解决方案3】:

      这个答案依赖于每个 Occurrence 的 OccurrenceTime:-

      更新 OccBuck 集
      OccBuck.FirstOccurrenceID = Occ.OccurrenceID,
      OccBuck.FirstOccurrenceTime = Occ.OccurrenceTime,
      OccBuck.FirstOccurrenceMessage = Occ.OccurrenceMessage
      来自
      dbo.OccurrenceBucket 作为 OccBuck
      内部连接 ​​dbo.Occurrence 作为 Occ 在 OccBuck.OccurrenceBucketID = Occ.OccurrenceBucketID
      内连接(选择 OccurrenceBucketID,
      MIN(OccurrenceTime) 作为 'MinOccurrenceTime'
      来自 dbo.Occurrence
      按 OccurrenceBucketID 分组)作为 Occ.OccurrenceBucketID= minOcc.OccurrenceBucketID 上的 minOcc 和
      Occ.OccurrenceTime = minOcc.MinOccurrenceTime

      【讨论】:

        猜你喜欢
        • 2015-05-20
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多