복붙노트

[SQL] 내가 한 번 사용 후 왜 내 CTE에 액세스 할 수 없습니다?

SQL

내가 한 번 사용 후 왜 내 CTE에 액세스 할 수 없습니다?

내 저장 프로 시저의 외모가 좋아 :

WITH MYCTE(....)
AS 
(
...
)

UPDATE ... (using my CTE)



DELETE ( using my CTE)  <---  says the object, my CTE, doesn't exist

난 단지는 한 번 사용할 수 있습니까?

해결법

  1. ==============================

    1.귀하의 예제 코드에서 CTE 만 UPDATE 지속. 당신이 마지막으로 더 이상 그것을해야하는 경우와 #tempTable 또는 @tableVariable을 채우기 다음 업데이트를 그에서 삭제 고려.

    귀하의 예제 코드에서 CTE 만 UPDATE 지속. 당신이 마지막으로 더 이상 그것을해야하는 경우와 #tempTable 또는 @tableVariable을 채우기 다음 업데이트를 그에서 삭제 고려.

    당신은 또한 당신이 영향을받는 행을 캡처 할 수 있도록 다음과 같은 출력 절을 사용하여 UPDATE를 증가 할 수있다. 그리고 DELETE에서 사용, 여기 좋아 :

    set nocount on
    DECLARE @Table     table (PK int, col1 varchar(5))
    DECLARE @SavedPks  table (PK int)
    
    INSERT INTO @Table VALUES (1,'g')
    INSERT INTO @Table VALUES (2,'g')
    INSERT INTO @Table VALUES (3,'g')
    INSERT INTO @Table VALUES (4,'g')
    INSERT INTO @Table VALUES (5,'x')
    INSERT INTO @Table VALUES (6,'x')
    set nocount off
    
    ;WITH MYCTE
    AS 
    (
      SELECT PK, col1 FROM @Table
    )
    UPDATE MYCTE
        SET col1='xyz'
        OUTPUT INSERTED.PK
            INTO @SavedPks
        WHERE col1='g'
    
    SELECT 'A',* FROM @Table
    
    DELETE @Table
        WHERE PK IN (SELECT PK  from @SavedPks)
    
    SELECT 'B',* FROM @Table
    

    산출:

    (4 row(s) affected)
         PK          col1
    ---- ----------- -----
    A    1           xyz
    A    2           xyz
    A    3           xyz
    A    4           xyz
    A    5           x
    A    6           x
    
    (6 row(s) affected)
    
    (4 row(s) affected)
    
         PK          col1
    ---- ----------- -----
    B    5           x
    B    6           x
    
    (2 row(s) affected)
    
  2. ==============================

    2.네의 WITH MYCTE 절은 이후 여러 쿼리에서 사용하기에 영구적으로 객체를 생성하지 않습니다 : 그것은 단지 당신이 그 조항을 추가하는 하나의 쿼리를 수정입니다! 당신은 매우 다른 functonality 필요한 경우 뷰를 사용하는 대신, 고려 ...

    네의 WITH MYCTE 절은 이후 여러 쿼리에서 사용하기에 영구적으로 객체를 생성하지 않습니다 : 그것은 단지 당신이 그 조항을 추가하는 하나의 쿼리를 수정입니다! 당신은 매우 다른 functonality 필요한 경우 뷰를 사용하는 대신, 고려 ...

  3. ==============================

    3.CTE를 발현은 몸에서만 유효합니다. 당신이 다른 곳에서 사용하려면, 당신은 너무 WITH 절을 반복해야합니다.

    CTE를 발현은 몸에서만 유효합니다. 당신이 다른 곳에서 사용하려면, 당신은 너무 WITH 절을 반복해야합니다.

    WITH MYCTE(....) AS ( ... ) 
    UPDATE ... (using my CTE);  
    -- a semicolon is necessary for statements followed by a CTE declaration
    
    WITH MYCTE(....) AS ( ... )
    DELETE ( using my CTE); 
    
  4. ==============================

    4.CTE는 무엇이든 '실제'를 작성하지 않습니다. 이들은 성명에서, 반복적으로 단순히 언어 요소, 사용되는 테이블 표현식을 표현하는 방법도 가능하다. 당신이 말할 때

    CTE는 무엇이든 '실제'를 작성하지 않습니다. 이들은 성명에서, 반복적으로 단순히 언어 요소, 사용되는 테이블 표현식을 표현하는 방법도 가능하다. 당신이 말할 때

    WITH cteFoo AS (select ... from table where ...)
    select ... from cteFoo where ...
    

    말하는 또 다른 방법입니다

    select ... from (select ... from table where ....) as cteFoo where ...
    

    CTE 및 파생 테이블은 파생 테이블을 사용하는 쿼리는 CTE로 rewriten 할 수 있으며, 비 재귀 CTE는 파생 테이블을 사용하여 쿼리로 다시 작성할 수 있습니다 매우 유사하다. 더 간결하고 읽기 쉽게하기 위해 개인적으로, 나는 훨씬 더 CTE 양식 역자 주.

    CTE는 여러 번 한 번만 선언으로 사용하는 테이블 식을 허용 :

      WITH cte AS (select ... from table where ...)
      select ... 
        from cte a join cte b on ...
      where ...
    

    의미 론적으로 유사한 파생 테이블 양식이 비교 :

    select ... 
    from (
       select ... from table where ...) as a
    join (
       select ... from table where ...) as b
       on ...
    where ...
    

    열팽창 계수는 분명히 더 읽을 수 있습니다. 하지만 당신은 두 가지 형태가 동일한 쿼리를 생산하고 있음을 이해해야합니다. 열팽창 계수의 형태는 중간 결과는이 중간 결과에서 실행되는 조인 후 작성하는 것이 좋습니다 수도 있지만 이것은 사실이 아니다. 열팽창 계수의 형태는 CTE의 테이블 expresion가 두 번 실행된다는 사실을 취소하게 파생 테이블 하나, 정확히 같은 형태로 컴파일됩니다.

  5. from https://stackoverflow.com/questions/1590994/why-cant-i-access-my-cte-after-i-used-it-once by cc-by-sa and MIT license