0

PreNote:別名手洗い; これはブラウンフィールドプロジェクトで行われている作業です


次のような「ProductLine」テーブルがあります

| ProductLineID(pk)| ProductID(fk)| ResellerID(fk)| その他のもの|
| -------------------- | ---------------- | ----------- ------ | ------------- |
| 1 | 28 | 298818 | -|

現在のシステムには、製品テンプレートラインのテーブルがあり、新しいリセラーが作成されるたびに、そのリセラーにリンクされた一連の製品ラインが作成されます。そのリセラーが組織の製品を編集したい場合は、アカウントに基づいて表示されるという考えです。

これらの製品ラインは、販売テーブル(カートテーブルにリンクされている)にリンクされている販売ラインテーブルで使用されます。

さまざまな理由で製品ラインに接続されたテーブルがいくつかあります。

私が見ていたのは、製品ラインの重複排除コピーを作成し、一部のデータを削除して、再販業者が変更を加えた場合にのみ新しいラインが作成されるようにすることでした。したがって、ページが124,000行を超えて69行に減少します(5年間でこの機能を使用した人はいません)。

次に、古いProductLineテーブルを参照として使用し、既存のデータ(販売ラインテーブルのProductLineId )を変更して、元の行ProductIDを読み取り、新しい一致するLineID(製品ごとに1つ)を見つけて、新しいProductLineIDを指すようにします。。

これを行うための最良の方法は何だろうと思っていました。カーソルが頭に浮かびますが、ピッチフォークを使用してDBAを広範囲から引き出す傾向があります。おそらく、SQLの苦痛が少ないほど、いくつかのテーブルで同様のクエリを実行する必要があります。

視覚化を少し簡単にするために、販売ラインは次のようになります

| SaleLineId(pk)| SaleID(fk)| ProductLineId(fk)| 価格|
| ----------------- | ------------- | ----------------- --- | ------- |
| 1992 | 29 | 10283 | 9.00 |

追加

古いProductLineテーブルの名前をLegacyProductLineに変更する予定です。次に、重複排除して、そこから製品ラインをクリーンなProductLineTableに挿入します。

次に、SalesLine(およびその他)のProductLineIdを新しいProductLineIdに置き換える必要があります。

LegacyProductLineは、ProductLineTableのProductLineIDが何であるかを認識しません。したがって、他に一致するパラメーターがないため、それらを一致させる方法としてProductIDを検討していました。


    + ----------------- + + ----------------- + + ----------- ------- +
    | LegacyProductLine | | ProductLine | | セールライン|
    | ----------------- | | ----------------- | | ------------------ |
    | ProductLineId PK | | ProductLineID PK | | SaleLineId PK |
    |製品名| | ProductName | | ProductLineId FK |
    |...いくつかのもの| | ...いくつかのもの| | 料金|
    | ResellerID FK | | | | |
    | ProductID FK | | ProductId | | |
    | | | | | |
    | | | | | |
    | | | | | |
    | | | | | |
    | | | | + ------------------ +
    | | | |
    | | | |
    | | | |
    | | | |
    + ----------------- + + ----------------- +
     200K行26行
     主に重複データを複製します

レガシーテーブルは参照用に一時的なものであり、削除されます。SaleLineテーブルのProductLineIDを変更する必要があります。

現在、SaleLineテーブルには、レガシーテーブルのProductLineIdが含まれています。これらは、ProductLineテーブルのProductLineIdを使用するために更新する必要があります。

4

1 に答える 1

1

この音では、ループ*が必要かどうかはわかりません。以下の仮定に基づいて提案されたソリューションは次のとおりです

重複排除されたデータを使用して新しいProductLine(PL)テーブルを作成する場合は、NewPLからOldPLへのマッピングテーブル(Map_OldPL_NewPL)を作成する必要があります。これにより、問題は簡単になります。

UPDATE SalesLine
SET PLId = NewPLId
FROM SalesLine
    JOIN Map_OldPL_NewPL AS Map
        ON SalesLine.PLId = OldPLId

ただし、このソリューションは非常に簡単なので、ProductLineの重複排除方法についてもっと質問していると思いますので、以下の私の仮定を明確にしてください。

*重複排除された製品ラインテーブルを作成するメカニズムがすでに整っていることを前提としています。しかし、それがあなたが求めていることかもしれません。その場合、他の人が同じことを想定しないように、それを明確にしてください:)。その場合は答えを拡張する必要があります:)

アップデート:

これが完全な答えです。おそらくこれはすべて1つまたは2つのクエリ内で実行できますが、この方法では、いつでもマッピングテーブルを振り返ることができます。PK(ProductLineId)を除いてすべてが同じである場合、それは重複していると想定しています。そうでない場合は、ROW_NUMBERパーティションと次の更新を変更する必要があります。

CREATE TABLE DuplicateMapping
(
    OldProductLineId INT, 
    ProductName VARCHAR(MAX), 
    ... , 
    ResellerId INT, 
    ProductId INT
    DuplicateHierarchy INT,
    NewProductLineId INT
)

INSERT INTO DuplicateMapping
SELECT  ProductLineId AS OldProductLineId, ProductName, ... , ResellerId, ProductId, 
    ROW_NUMBER() OVER 
        (PARTITION BY ProductName, 
            ... , ResellerId, ProductId ORDER BY ProductLineId) AS DuplicateHierarchy,
    ProductLineId AS NewProductLineId
FROM ProductLine

UPDATE DuplicateMapping
SET NewProductLineId = Dup.OldProductLine
FROM DuplicateMapping AS Main
    JOIN DuplicateMapping AS Dup
        ON DuplicateMapping.ProductName = Dup.ProductName
            AND DuplicateMapping.ResellerId = Dup.ResellerId
            AND DuplicateMapping.ProductId = Dup.ProductId
            ...
            --Do NOT include OldProductLineId, NewProductLineId or DuplicateHierarchy
WHERE Dup.DuplicateHierarchy = 1

DELETE ProductLine
WHERE EXISTS 
(
    SELECT 1 
    FROM DuplicateMapping
    WHERE DuplicateMapping.ProductLineId = ProductLine.ProductLineId
        AND DuplicateMapping.DuplicateHierarchy > 1
)

UPDATE SaleLine
SET ProductLineId = NewProductLineId
FROM SaleLine
    JOIN DuplicateMapping
        ON ProductLineId = OldProductLineId
--Without this, you would not cause any harm
--Howerver, why update the same value over itself 
WHERE DuplicateHierarchy > 1
于 2012-03-01T16:41:36.200 に答える