【问题标题】:sql Update statement selfjoinsql更新语句selfjoin
【发布时间】:2014-08-06 17:18:43
【问题描述】:
Gid Rid Cid PriorityId

1   7   11  NULL
1   7   12  NULL
1   8   13  NULL
1   9   25  NULL
1   13  18  NULL
1   13  19  NULL
1   14  23  NULL
1   14  24  NULL

我需要将 priorityId 设置为以下。任何人都可以建议一个 sql update 语句。 我想我需要一个由 Rid 和 Gid 组成的小组或自行加入

Gid Rid Cid PriorityId

1   7   11  1
1   7   12  2
1   8   13  1
1   9   25  1
1   13  18  1
1   13  19  2
1   14  23  1
1   14  24  2

谢谢

【问题讨论】:

  • 当您尝试按 rid 和 gid 进行分组时,或者当您尝试通过将表连接到自身来进行更新时发生了什么?没有看到预期的结果吗?
  • 什么版本的 SQL? mySQL、SQL Server 2012、Oracle 11g?这看起来可以通过在 SQL Server 或 Oracle 中使用 over 语法所涉及的窗口概念来处理。比如:stackoverflow.com/questions/14359749/…
  • Cid 重要吗?您使用的是什么风格的 SQL?

标签: sql


【解决方案1】:

我会这样写更新:

with toupdate as (
    Select t.*
           Row_Number() Over (Partition By Gid, Rid Order By Gid, Rid, Cid) As new_PriorityId
    From Table t
   )
update toupdate
    set PriorityId = new_PriorityID;

【讨论】:

    【解决方案2】:

    对于 SQL Server 2012,您可以使用下面的 Over 语句,将 GidRid 作为 partitions

    Update  T
    Set     PriorityId = D.PriorityId
    From    
    (   
        Select  Gid, Rid, Cid,
                Row_Number() Over (Partition By Gid, Rid Order By Gid, Rid, Cid) As PriorityId
        From    Table
    ) D
    Join    Table   T   On  T.Gid = D.Gid 
                        And T.Rid = D.Rid 
                        And T.Cid = D.Cid 
    

    下面的内部语句应该在不更新表格的情况下显示结果:

    Select  Gid, Rid, Cid,
            Row_Number() Over (Partition By Gid, Rid Order By Gid, Rid, Cid) As PriorityId
    From    Table
    

    【讨论】:

    • 我尝试更新 u set u.priorityid = T1.RowFilter FROM Table1 u Inner Join (SELECT groupid, ruleid, DENSE_RANK() OVER (ORDER BY groupid, ruleid) AS RowFilter FROM Table1 hl ORDER BY RowFilter ) 作为 T1 ON u.gid= T1.gid 和 u.rid= T1.rid。似乎没有做排名。所以我需要row_number而不是dense_rank。和 orderby ConnectionID
    • +1 。 . .这是一个很好的答案。但是,有一种更简单的方法来编写更新。看我的回答。
    猜你喜欢
    • 1970-01-01
    • 2016-03-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-01-30
    • 2010-11-06
    • 2012-03-20
    相关资源
    最近更新 更多