2017-12-04 17 views
0

私はそれがしたいと思う以下のCTEを持っています。CTEの結果を使用して別のテーブルを更新する

;WITH numbering AS 
(
    SELECT SrcID, AsOfDate, PID, 
      dense_rank() OVER (PARTITION BY SrcID ORDER BY PID) AS rowno 
    FROM RAW_DATA 
) 
SELECT SrcID, 
     MAX(CASE rowno WHEN 1 THEN PID END) AS PID1, 
     MAX(CASE rowno WHEN 2 THEN PID END) AS PID2, 
     MAX(CASE rowno WHEN 3 THEN PID END) AS PID3, 
     MAX(CASE rowno WHEN 4 THEN PID END) AS PID4 
FROM numbering 
GROUP BY SrcID 

は、私はそれだけでなく、AsOfDateとPIDを使用する必要があるが、それはPID1、PID2、PID3、及びPID4を移入オフに投げるように私は、CTEでこれらを表示する必要はありません。 。 。そのすべてが今正しい。 'RAW_DATA'という名前の別のテーブルへの更新を行うには、SrcIDとAsOfDateが必要です。どのようにして、必要な特定のデータセットを生成するためにCTEを実行し、SrcIDとAsOfDateの間の結合に基づいてRAW_DATAテーブルへの更新を行うことができますか?無効なオブジェクト名「番号」:

;WITH numbering AS 
    (
     SELECT SrcID, AsOfDate, PID, 
       dense_rank() OVER (PARTITION BY SrcID ORDER BY PID) AS rowno 
     FROM RAW_DATA 
    ) 
    SELECT SrcID, 
      MAX(CASE rowno WHEN 1 THEN PID END) AS PID1, 
      MAX(CASE rowno WHEN 2 THEN PID END) AS PID2, 
      MAX(CASE rowno WHEN 3 THEN PID END) AS PID3, 
      MAX(CASE rowno WHEN 4 THEN PID END) AS PID4 
    FROM numbering 
    GROUP BY SrcID 

INSERT INTO RAW_DATA(SrcID, AsOfDate, PID, PID1, PID2, PID3, PID4) 
Select * 
FROM   RAW_DATA INNER JOIN numbering 
      ON RAW_DATA.SrcID = numbering.SrcID 
      AND RAW_DATA.AsofDate = numbering.AsofDate 

しかし、それはこのエラーがスローされます:

は、私はそれがこのようなものであるべきだと思います。私は、これは動作しますが、それが吹く...少しだけここに私のオリジナルのポストを修正2008年

...

ジェフリー、私はあなたのソリューションをテストしていますSQL Server上

--drop table Count_Unique_PID 
;WITH numbering AS 
    (
     SELECT SrcID, AsOfDate, PID,PID1,PID2,PID3,PID4, 
       dense_rank() OVER (PARTITION BY AsOfDate, SrcID ORDER BY PID) AS rowno 
     FROM RAW_DATA 
    ) 

    SELECT SrcID,AsOfDate, PID, 
      MAX(CASE rowno WHEN 1 THEN PID END) AS PID1, 
      MAX(CASE rowno WHEN 2 THEN PID END) AS PID2, 
      MAX(CASE rowno WHEN 3 THEN PID END) AS PID3, 
      MAX(CASE rowno WHEN 4 THEN PID END) AS PID4 
    INTO Count_Unique_PID 
    FROM numbering 
    GROUP BY SrcID,AsOfDate, PID 

    SELECT SrcID, 
      AsOfDate, 
      PID, 
      PID1, 
      PID2, 
      PID3, 
      PID4 
    FROM Count_Unique_PID 
    GROUP BY SrcID,AsOfDate, PID,PID1,PID2,PID3,PID4 


UPDATE RAW_DATA 
SET    PID1 = B.PID1, 
       PID2 = B.PID2, 
       PID3 = B.PID3, 
       PID4 = B.PID4 
FROM   RAW_DATA AS A INNER JOIN Count_Unique_PID As B 
      ON A.SrcID = B.SrcID 
      AND A.AsofDate = B.AsofDate 

ています私の行を357,518人から724,150人に増やす。レコードの数は同じままでなければなりません。更新が完了した後は357,518のままでなければなりません。多分、私は、Group Byをどこかに迷い込んでいるのかもしれません。私は実際の問題が何であるかはわかりません。これに関する追加的な考えは?すべての助けをありがとう!

+1

ドキュメントから: "共通テーブル式(CTE)は、* SELECT * INSERT、UPDATE、DELETE、またはCREATE VIEWステートメントの実行スコープ内で定義される一時的な結果セットと考えることができます。強調する私。 –

答えて

1

CTEは、直後のステートメントでのみ参照できます。後で結果が必要な場合は、一時テーブルにCTEを挿入することができ、その一時テーブルから選択し、その一時テーブルから挿入します。

;WITH numbering AS 
    (
     SELECT SrcID, AsOfDate, PID, 
       dense_rank() OVER (PARTITION BY SrcID ORDER BY PID) AS rowno 
     FROM RAW_DATA 
    ) 

    SELECT SrcID, 
      MAX(CASE rowno WHEN 1 THEN PID END) AS PID1, 
      MAX(CASE rowno WHEN 2 THEN PID END) AS PID2, 
      MAX(CASE rowno WHEN 3 THEN PID END) AS PID3, 
      MAX(CASE rowno WHEN 4 THEN PID END) AS PID4 
    INTO #tmp 
    FROM numbering 
    GROUP BY SrcID 

    SELECT SrcID, 
      PID1, 
      PID2, 
      PID3, 
      PID4 
    FROM #tmp 
    GROUP BY SrcID 

INSERT INTO RAW_DATA(SrcID, AsOfDate, PID, PID1, PID2, PID3, PID4) 
Select * 
FROM   RAW_DATA INNER JOIN #tmp 
      ON RAW_DATA.SrcID = #tmp.SrcID 
      AND RAW_DATA.AsofDate = #tmp.AsofDate 
+0

私は単にもう1つのフィールドに参加して、私が探していたレコードの数を得ました。感謝ジェフリー! – ryguy72

0

あなたは二CTEとしてクエリをカプセル化する必要があります。

sintaxisは、あなたのSELECT文が(多分それは検証のためです)の挿入のために何もしていない

WITH cte1 as (
    SELECT ... 
), cte2 as (
    SELECT * 
    FROM cte1 
    ..... 
) 
INSERT INTO table_name 
SELECT * 
FROM cte2 
0

です。 select文を削除するだけで、挿入が機能します。あなたにもCTE上で選択を実行する必要がある場合は、それは限り、クエリが実行されているとして存在するに

;WITH numbering AS 
(
    SELECT SrcID, AsOfDate, PID, 
      dense_rank() OVER (PARTITION BY SrcID ORDER BY PID) AS rowno 
    FROM RAW_DATA 
) 


INSERT INTO RAW_DATA(SrcID, AsOfDate, PID, PID1, PID2, PID3, PID4) 
Select * 
FROM   
     RAW_DATA INNER JOIN numbering 
     ON RAW_DATA.SrcID = numbering.SrcID 
     AND RAW_DATA.AsofDate = numbering.AsofDate 

は、あなたは一時テーブルを使用する必要があります。

+0

私はあなたがグループを逃したと思いますか? –

+0

私はグループを見ましたが、SQLがどのように書かれているのかに基づいて、挿入のために考慮されていませんでした。出力のためだけにありました。 – SteveB

+0

結果には 'PID、PID1、PID2、PID3、PID4' –

関連する問題