使用GROUP by更新

时间:2014-11-26 18:01:37

标签: sql sql-server

我找到了几个类似的线程但没有一个只有一个表。基本上我们在报价系统上做了一些更新,找不到报价修订历史,因为它存储的唯一地方是“priorquoteID”。我编写了一个SQL存储过程,遍历并遍历了所有先前的引号,并设置了一个我创建的新字段,名为“OriginalQuoteID”,等于最旧的引号,并将最新的引用设置为“CurrentQuote”。

然而,大约2/3的引号从未修改过,所以我的SQLProcedure没有处理。从概念上讲,我需要一些像这样的东西:

update 
SalesQuotesTest.dbo.Quote 
set CurrentQuote = 1
group by OriginalQuoteID
having COUNT(*) < 2

所以任何没有修订的引用(是修订线程中的唯一引用)我可以标记为当前。

这有意义吗?有什么想法吗?

3 个答案:

答案 0 :(得分:1)

尝试下面的更新(带有分组依据的内联视图用于过滤要更新的行):

update q
    set q.CurrentQuote = 1
from SalesQuotesTest.dbo.Quote q
join (
    select OriginalQuoteID 
    from SalesQuotesTest.dbo.Quote
    group by OriginalQuoteID
    having COUNT(*) < 2
) s
on q.OriginalQuoteID = s.OriginalQuoteID

答案 1 :(得分:1)

您可以使用子查询:

update 
SalesQuotesTest.dbo.Quote 
set CurrentQuote = 1
where OriginalQuoteID in ( select OriginalQuoteID 
                           from SalesQuotesTest.dbo.Quote 
                           group by OriginalQuoteID
                           having COUNT(*) < 2
                          )

答案 2 :(得分:1)

这是完全未经测试的,但这是我的建议。进行适合您的架构所需的任何更改。

 WITH quotesToUpdate(QuoteId) AS (
      SELECT Quote.Identifier
      FROM SalesQuotesTest.dbo.Quote
      GROUP BY OriginalQuoteID HAVING COUNT(*) < 2
 )
 UPDATE SalesQuotesTest.dbo.Quote
 SET CurrentQuote = 1
 FROM SalesQuotesTest.dbo.Quote q
 INNER JOIN quotesToUpdate qu ON q.Identifier = qu.QuoteId