development

INSERT INTO와 WITH / CTE 결합

big-blog 2020. 6. 14. 09:41
반응형

INSERT INTO와 WITH / CTE 결합


매우 복잡한 CTE가 있으며 결과를 실제 테이블에 삽입하고 싶습니다.

다음이 유효합니까?

INSERT INTO dbo.prf_BatchItemAdditionalAPartyNos 
(
    BatchID,
    AccountNo,
    APartyNo,
    SourceRowID
)       
WITH tab (
  -- some query
)    
SELECT * FROM tab

재사용 할 수있는이 CTE를 작성하는 기능을 사용하려고합니다. 이견있는 사람?


CTE를 먼저 넣고 INSERT INTO를 select 문과 결합해야합니다. 또한 CTE 이름 뒤에 나오는 "AS"키워드는 선택 사항이 아닙니다.

WITH tab AS (
    bla bla
)
INSERT INTO dbo.prf_BatchItemAdditionalAPartyNos (
BatchID,
AccountNo,
APartyNo,
SourceRowID
)  
SELECT * FROM tab

이 코드는 CTE가 정확히 4 개의 필드를 반환하고 해당 필드가 INSERT 문에 지정된 순서와 유형으로 일치한다고 가정합니다. 그렇지 않은 경우 "SELECT *"를 원하는 필드 선택으로 바꾸십시오.

함수 사용에 대한 귀하의 질문에 대해서는 "의존합니다"라고 말할 것입니다. 성능상의 이유로 인해 데이터를 테이블에 저장하고 함수를 통해 데이터를 사용할 때 속도가 허용되는 경우 함수를 옵션으로 간주합니다. 반면에 CTE 결과를 여러 다른 쿼리에서 사용해야하고 속도가 이미 문제인 경우 테이블 (정규 또는 임시)로 이동합니다.

WITH common_table_expression (Transact-SQL)


네:

WITH tab (
  bla bla
)

INSERT INTO dbo.prf_BatchItemAdditionalAPartyNos (  BatchID,                                                        AccountNo,
APartyNo,
SourceRowID)    

SELECT * FROM tab

이것은 여러 CTE를 지원하는 SQL Server 용입니다.

WITH x AS (), y AS () INSERT INTO z (a, b, c) SELECT a, b, c FROM y

Teradata는 하나의 CTE 만 허용하며 구문은 예제입니다.


WITH공통 테이블 식에 대한 절은 상단에 이동합니다.

CTE에서 모든 삽입을 래핑하면 쿼리 매핑을 열 매핑에서 시각적으로 분리 할 수 ​​있다는 이점이 있습니다.

실수를 찾아 내십시오 :

WITH _INSERT_ AS (
  SELECT
    [BatchID]      = blah
   ,[APartyNo]     = blahblah
   ,[SourceRowID]  = blahblahblah
  FROM Table1 AS t1
)
INSERT Table2
      ([BatchID], [SourceRowID], [APartyNo])
SELECT [BatchID], [APartyNo], [SourceRowID]   
FROM _INSERT_

같은 실수:

INSERT Table2 (
  [BatchID]
 ,[SourceRowID]
 ,[APartyNo]
)
SELECT
  [BatchID]      = blah
 ,[APartyNo]     = blahblah
 ,[SourceRowID]  = blahblahblah
FROM Table1 AS t1

A few lines of boilerplate make it extremely easy to verify the code inserts the right number of columns in the right order, even with a very large number of columns. Your future self will thank you later.

참고URL : https://stackoverflow.com/questions/3306096/combining-insert-into-and-with-cte

반응형