INSERT INTO와 WITH / CTE 결합


157

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

다음이 유효합니까?

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

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

답변:


271

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)


19

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

몇 줄의 상용 구판을 사용하면 매우 많은 수의 열이 있어도 코드가 올바른 수의 열을 올바른 순서로 삽입하는지 확인할 수 있습니다. 미래의 자기 자신은 나중에 감사합니다.


3
대단해! 갑자기, 나는 INSERT 진술을 싫어하지 않습니다 ...
NReilingh

1
이것은 매우 유용합니다. 첫 번째 읽기에서 그것을 놓친 다른 사람에게는 이것이 해결하는 문제는 삽입 문에서 삽입 할 필드의 상대적 순서와 필드에 삽입 할 값에 의해 매핑이 정의된다는 것입니다. 이것을 일반적으로 쓰면 육안 검사로 두 주문이 동일한 지 확인하기가 매우 어렵습니다. CTE를 사용하면 값을 삽입 할 열 이름으로 이름을 지정할 수 있습니다. 따라서 두 줄로 정렬 할 수 있습니다.
티 도리스

16

네:

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 만 허용하며 구문은 예제입니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.