2011-12-29 111 views
0

下面我试图从子表更新父表的值和计数匹配值。我的数据库中的表格:子表中的更新,只有一个值得到更新

  1. issue_dimension id = issue_id并具有列accno。

  2. star_schema id为star_id,这个孩子柱已FK ISSUE_ID和列book_frequency

的book_frequency需要匹配在父表中每个登录号的数量,我想这

update [test1] .[dbo] .star_schema 
set [book_frequency] = (
    select top 1 COUNT([issue_dimension].ACCNO)as book_frequency 
    from issue_dimension 
    group by ACCNO having (COUNT(*)>1) and 
     issue_dimension.ACCNO = star_schema .ACCNO 
) 

它仅更新第一个值计数issue_dimension。我需要计算issue_dimension中的每个accno并将其更新为匹配star_schema的accno。

UPDATE [test1].[dbo].star_schema SET 
    [book_frequency] = 
     ( 
      SELECT COUNT([issue_dimension].ACCNO) 
      FROM issue_dimension 
      WHERE issue_dimension .ACCNO = star_schema.ACCNO 
      HAVING COUNT(*)>1 
     ) 

回答

1
UPDATE s 
SET [book_frequency] = i.CNT 
FROM [test1].[dbo].star_schema s 
    INNER JOIN 
    ( 
     SELECT ACCNO, COUNT(*) as CNT 
     FROM issue_dimension 
     GROUP BY ACC_NO 
     HAVING COUNT(*)>1 
    ) i on (s.ACCNO = i.ACCNO) 

我不”: 我从来没有通过连接两个或多个表,任何人都可以在此帮助加入这样

+0

它再次只更新一个值,它只计算一个值 – user1074474 2011-12-29 07:52:07

+0

有多少行返回:'SELECT ACCNO,COUNT(*)as CNT FROM issue_dimension GROUP BY ACC_NO HAVING COUNT(*)> 1'? – chopikadze 2011-12-29 08:35:27

0

尝试,不进行分组,只是用WHERE条款做了更新牛逼检查它,但它应该工作

+0

嗯,依然的击打更新一个结果 – user1074474 2011-12-29 07:11:20

+0

将其与连接解决?我从来没有在更新语句中使用连接 – user1074474 2011-12-29 07:12:06

+1

您可以在更新中使用连接,但我认为不是GROUP BY,那么,可能是您再次剥离HAVING COUNT(*)> 1? – 2011-12-29 07:20:53

0

这并不完全清楚,我这样的回答有点猜测:

update s set 
    book_frequency = t.qty 
from star_schema s 
join issue_dimension i on s.issue_id = s.issue_id 
join (select count(*) as qty, accno 
    from issue_dimension 
    group by accno 
) t on i.accno = t.accno 
+0

这里是不必要的加入issue_dimension :) – chopikadze 2011-12-29 07:22:40

+0

@chopikadze:在问题中,完全部分描述表没有关于表'star_schema'中列'accno'的信息。我注意到的唯一连接是'issue_dimension.issue_id(id,可能是PK)= star_schema.issue_id(FK)'。这就是我用它来加入它们的原因。 – 2011-12-29 07:31:03

+0

但问题中的示例查询包含:)好吧,无论如何,我们的答案都非常接近,应该允许提问者找到正确的解决方案,我认为:) – chopikadze 2011-12-29 07:34:12

0

下面是BOL已经做了你要寻找的那种东西,用AW的例子:

USE AdventureWorks2008R2; 
GO 
UPDATE Sales.SalesPerson 
SET SalesYTD = SalesYTD + 
    (SELECT SUM(so.SubTotal) 
    FROM Sales.SalesOrderHeader AS so 
    WHERE so.OrderDate = (SELECT MAX(OrderDate) 
          FROM Sales.SalesOrderHeader AS so2 
          WHERE so2.SalesPersonID = so.SalesPersonID) 
    AND Sales.SalesPerson.BusinessEntityID = so.SalesPersonID 
    GROUP BY so.SalesPersonID);