Обновление в дочерней таблице, обновлено только одно значение - PullRequest
0 голосов
/ 29 декабря 2011

Ниже я пытаюсь обновить значение родительской таблицы из дочерней таблицы и подсчитываю совпадающие значения. Таблицы в моей БД:

  1. issue_dimension с id = issue_id и столбцом accno.

  2. star_schema с идентификатором star_id, этот дочерний столбец имеет fk issue_id и столбец book_frequency

book_frequency должен соответствовать количеству каждого accno в родительской таблице, я попробовал это

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
)

Обновляется только 1-е значение count__mension. Мне нужно посчитать каждое акко в Issue_dimension и обновить его до соответствия Акко star_schema. Я никогда не обновлялся, объединяя две или более таблицы, может кто-нибудь помочь в этом с объединениями

Ответы [ 4 ]

1 голос
/ 29 декабря 2011
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 голосов
/ 29 декабря 2011

Вот пример из 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);
0 голосов
/ 29 декабря 2011

Мне не совсем понятно, поэтому ответ немного угадать:

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 голосов
/ 29 декабря 2011

Попробуйте таким образом, без группировки, просто с предложением WHERE:

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
        )
...