12

私はSQLに少し慣れていないので、SQL Server 2012で更新ステートメントをハードコーディングせずにこれを行う最良の方法を見つけようとしています.

基本的に、列 ( ) を持つ企業 (サプライ チェーンを考えてください) の階層テーブルがありますCompanyID, ParentID, ParentPriceAdj, CompanyPriceAdj。各会社には、親からテーブル内の定価を変更する価格調整が割り当てられ、PartMaster親から子に調整をカスケードすることによって最終的な価格が計算されます。

親の価格調整が更新された場合、それをすべての子会社に反映させたいなど

別名:

CompanyPriceAdj特定の を更新するとき、子の ( )updatedcompanyIDを再帰的に見つけて、それらを( )に更新したいCompanyIDParentId = updatedCompanyIDParentPriceAdjParentCompanyparentPriceAdj * (1 + CompanyPriceAdj)

CompanyId     ParentID     ParentPriceAdj    CompanyPriceAdj
  5               6              0.96               .10
  6               8              1                  .20
  7               6              0.96               .15
  8              11              1                   0
 10               6              0.96                0
 11              12              1                   0

私は、更新されたばかりのすべての子に対して更新を繰り返し呼び出し、その後自分の子を更新するストアドプロシージャを使用することを考えていました....会社に子がなくなるまで

私は周りを見回してみましたが、このような例は見つかりませんでした

これは私が今持っているものです

ALTER PROCEDURE [dbo].[UpdatePricing] 
@updatedCompanyID int, @PriceAdj decimal
AS
BEGIN
SET NOCOUNT ON;

    WHILE (Select CompanyID From CompanyInfo Where ParentID = @updatedCompanyID) IS NOT NULL
       UPDATE CompanyInfo 
       SET  ParentPriceAdj = @PriceAdj * (1+CompanyPriceAdj), 
            @updatedCompanyId = CompanyID, 
            @PriceAdj = CompanyPriceAdj         
       WHERE ParentID = @updatedCompanyID

       --- some method to call itself again for each (@updatedCompanyID, @PriceAdj)
END
4

3 に答える 3

12

再帰的 CTE を使用して、次のような階層をたどることができます。

ALTER PROCEDURE [dbo].[UpdatePricing]
(
    @companyID int,
    @PriceAdj decimal
)
as
begin
    set nocount on

    update CompanyInfo
    set CompanyPriceAdj = @PriceAdj
    where CompanyID = @companyID

    ;with Hierarchy(CompanyID, ParentID, InPriceAdj, OutPriceAdj)
    as (
        select D.CompanyID, D.ParentID, cast(D.ParentPriceAdj as float),
            cast(D.ParentPriceAdj as float) * cast(1 + D.CompanyPriceAdj as float)
        from CompanyInfo D
        where CompanyID = @companyID
        union all
        select D.CompanyID, D.ParentID,
            H.OutPriceAdj, H.OutPriceAdj * (1 + D.CompanyPriceAdj)
        from Hierarchy H
            join CompanyInfo D on D.ParentID = H.CompanyID
    )
    update D
    set D.ParentPriceAdj = H.InPriceAdj
    from CompanyInfo D
        join Hierarchy H on H.CompanyID = D.CompanyID
    where
        D.CompanyID != @companyID

end
于 2013-07-08T19:55:40.640 に答える
3

t-sql で WITH 式を使用して、特定の子レコードのすべての親レコードを取得できます。また、ロジックに応じてレコード セット内の各レコードを更新できます。

ここに WITH 式のリンクがあります --

http://msdn.microsoft.com/en-us/library/ms175972.aspx

http://msdn.microsoft.com/en-us/library/ms186243(v=sql.105).aspx

于 2013-07-08T18:38:57.900 に答える