[SQL] 내가 한 번 사용 후 왜 내 CTE에 액세스 할 수 없습니다?
SQL내가 한 번 사용 후 왜 내 CTE에 액세스 할 수 없습니다?
내 저장 프로 시저의 외모가 좋아 :
WITH MYCTE(....)
AS
(
...
)
UPDATE ... (using my CTE)
DELETE ( using my CTE) <--- says the object, my CTE, doesn't exist
난 단지는 한 번 사용할 수 있습니까?
해결법
-
==============================
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.네의 WITH MYCTE 절은 이후 여러 쿼리에서 사용하기에 영구적으로 객체를 생성하지 않습니다 : 그것은 단지 당신이 그 조항을 추가하는 하나의 쿼리를 수정입니다! 당신은 매우 다른 functonality 필요한 경우 뷰를 사용하는 대신, 고려 ...
네의 WITH MYCTE 절은 이후 여러 쿼리에서 사용하기에 영구적으로 객체를 생성하지 않습니다 : 그것은 단지 당신이 그 조항을 추가하는 하나의 쿼리를 수정입니다! 당신은 매우 다른 functonality 필요한 경우 뷰를 사용하는 대신, 고려 ...
-
==============================
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.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가 두 번 실행된다는 사실을 취소하게 파생 테이블 하나, 정확히 같은 형태로 컴파일됩니다.
from https://stackoverflow.com/questions/1590994/why-cant-i-access-my-cte-after-i-used-it-once by cc-by-sa and MIT license
'SQL' 카테고리의 다른 글
[SQL] 좋은 C 번호가되는 SQLException을 잡기 및 재 시도에 대한 코딩 스타일이란 (0) | 2020.06.27 |
---|---|
[SQL] 여러 테이블에서 INSERT INTO 표 (0) | 2020.06.27 |
[SQL] 행 사이 SQL 차이 (0) | 2020.06.27 |
[SQL] 위해 SQL 트리 계층 구조 (0) | 2020.06.26 |
[SQL] 유사한 문자열을 포함하는 SQL 기록을 찾기 (0) | 2020.06.26 |