2017-05-16 22 views
0

現在、私が持っているストアドプロシージャは、データがどのソーステーブル(S1、S2、S3)から来るかに基づいて3つのテーブルを作成します。そうする際にランキング機能を使用して、製品番号と日付に基づいて各レコードをランク​​付けします。その後、SQL Server - 3つのテーブルを結合してフラグを更新する

SELECT 
    a.*, b.ProductNumber, 
    CAST(CASE 
      WHEN b.ProductNumber = b.NewProductNumber) 
       THEN 1 
       ELSE 0 
     END AS BIT) 'NewProduct', 
    ROW_NUMBER() OVER (PARTITION BY ProductNumber ORDER BY Date) 'RowNum' 
INTO 
    Table1 
FROM 
    Table2 a 
LEFT OUTER JOIN 
    Table3 b ON a.ID = b.ID and b.Source = 'S1' 

SELECT 
    a.*, b.ProductNumber, 
    CAST(CASE 
      WHEN b.ProductNumber = b.NewProductNumber) 
       THEN 1 
       ELSE 0 
     END AS BIT) 'NewProduct', 
    ROW_NUMBER() OVER (PARTITION BY ProductNumber ORDER BY Date) 'RowNum' 
INTO 
    Table1 
FROM 
    Table2 a 
LEFT OUTER JOIN 
    Table3 b ON a.ID = b.ID and b.Source = 'S2' 

SELECT 
    a.*, b.ProductNumber, 
    CAST(CASE 
      WHEN b.ProductNumber = b.NewProductNumber) 
       THEN 1 
       ELSE 0 
     END AS BIT) 'NewProduct', 
    ROW_NUMBER() OVER (PARTITION BY ProductNumber ORDER BY Date) 'RowNum' 
INTO 
    Table1 
FROM 
    Table2 a 
LEFT OUTER JOIN 
    Table3 b ON a.ID = b.ID and b.Source = 'S3' 

これは、1つの集団のテーブルにプールにこのデータをと「ROWNUM」

SELECT 
    ProductNumber, NewProductNumber, 
    CAST('Source1' AS VARCHAR(15)) 'SourceName', 
    NewProduct, RowNum 
INTO 
    CollectiveTable 
FROM 
    Table1 

UNION ALL 

SELECT 
    ProductNumber, NewProductNumber, 
    CAST('Source2' AS VARCHAR(15)),  
    NewProduct, RowNum 
FROM 
    Table2 

UNION ALL 

SELECT 
    ProductNumber, NewProductNumber, 
    CAST('Source3' AS VARCHAR(15)),  
    NewProduct, RowNum 
FROM 
    Table3; 

UPDATE CollectiveTable 
SET NewProduct = 0 
WHERE NewProduct = 1 
    AND RowNum != 1; 

に基づいて「NewProduct」フラグを更新し、私はからのレコードで終わるならば私の質問は、CollectiveTableでは、同じ製品で複数のソースが「新製品」と表示されている場合、元のソースのみが「新規」とマークされています。

私は本当にこのためにカーソルを使いたくありません。製品99999のために

例えば、

CollectiveTable

ProductNumber NewProductNumber SourceName  NewProduct  RowNum 
-------------------------------------------------------------------------- 
99999   99999    Source1   1    1 
99999   99999    Source2   1    1 
99999   99999    Source3   1    1 
00000   00000    Source2   1    1 
00000   00000    Source1   1    1 
12345   12345    Source3   1    1 
12345   12345    Source2   1    1 

"オリジナルソースは、" そのため、私は「NewProductを更新したいソース1、00000ソース1、& 12345ソース2

だろう"次のようなレコードのフラグ:

ProductNumber NewProductNumber SourceName  NewProduct  RowNum 
-------------------------------------------------------------------------- 
99999   99999    Source1   1    1 
99999   99999    Source2   0    1 
99999   99999    Source3   0    1 
00000   00000    Source2   0    1 
00000   00000    Source1   1    1 
12345   12345    Source3   0    1 
12345   12345    Source2   1    1 

これについては良い方法がありますか?ご協力いただきありがとうございます。

+0

*ソースがそのように増加し、本当に数値*されていますか?元のソース*をどうやって実際に決めるのですか? – Parfait

+1

同じテーブル名を1回のバッチで2回「SELECT INTO」することはできません。エラーが発生します。 –

答えて

0

最初に、私たちが問題を理解し、解決策を試すのを助けるために、テーブル定義とサンプルレコードのコードを追加することをお勧めします。

第二に、私は、そのうちのいくつかいくつかの仮定、上の私の答えを基づかよ:

  • あなたはあなたの通常のワークロードが行われた後、フラグを補正する非効率性を気にしません。
  • あなたはソースが3つしかありません。

最後に、これは確かに完全に他のアプローチによって負かさない場合は、改善のために多くの可能性を持っている:

-- Correct flags of any record that should be corrected due to presence of Source1. 
UPDATE C2C3 
SET NewProduct = 0 
FROM CollectiveTable AS C2C3 
INNER JOIN CollectiveTable AS C1 ON C2C3.ProductNumber = C1.ProductNumber AND C1.SourceName = 'SOURCE1' 
WHERE C2C3.SourceName IN ('Source2', 'Source3') 

-- Correct flags of Source3 records who weren't corrected by previous step. 
UPDATE C3 
SET NewProduct = 0 
FROM CollectiveTable AS C3 
INNER JOIN CollectiveTable AS C1C2 ON C1C2.ProductNumber = C3.ProductNumber AND C1C2.SourceName IN ('SOURCE1', 'SOURCE2') 
WHERE C3.SourceName IN ('Source3') 
関連する問題