2017-12-04 1 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 

그러나,이 오류가 발생합니다 :

는 나는 이런 식으로 뭔가해야한다고 생각합니다. 나는

제프리, 나는이 실행

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

... 솔루션을 테스트하고 있습니다 ... 여기 조금 내 원래의 게시물을 수정 2008 년

SQL 서버에,하지만 그것은 불면 내 행을 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

나는 하나의 필드에 합류하여 찾고있는 레코드의 수를 얻었습니다. 고마워, 제프리! – 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'를 삽입했다. –