DELETE 문에서 별명을 사용할 수없는 이유는 무엇입니까?


158

Visual Studio 2010의 SQL Server Compact Edition (일반적으로 SQL Server 및 SQL, 잘 모르겠습니다)에서이 명령은 작동합니다.

DELETE FROM foods WHERE (name IN ('chickens', 'rabbits'))

그러나이 명령은 다음과 같은 오류를 생성합니다. Error near identifier f. Expecting OUTPUT.

DELETE FROM foods f WHERE (f.name IN ('chickens', 'rabbits'))

@ aaron-bertrand 제목도 수정 해 주셔서 감사합니다. 내가 게시 한 내용에 대한 올바른 용어를 알지 못했습니다 (그렇지 않으면 Google이 신속하게 해결할 수있었습니다). 다시 감사합니다.
Ricardo Altamirano

걱정 마. 다른 독자들에게 분명히 알리려고 노력합니다.
Aaron Bertrand

다른 명령 간의 구문 변형이 때때로 직관적이지 않은 방식으로 당신에게 동의합니다.
Aaron Bertrand

다음은 같은 질문이지만 UPDATE 문에 대해서는 stackoverflow.com/questions/31551/…
Daniel Neel

답변:


239

당신이 말해야 할 테이블의 별칭을 지정하려면 :

DELETE f FROM dbo.foods AS f WHERE f.name IN (...);

DELETE특히 (적어도 IIRC)이 더 이상 엄격한 ANSI를 준수하지 않기 때문에이 특정 진술에 대한 앨리어싱 포인트를 보지 못했습니다 . 그러나 그렇습니다. 의견에서 알 수 있듯이 다른 쿼리 형식 (예 : 상관 관계)이 필요할 수 있습니다.


2
나는 주로 호기심이 많았습니다. 왜냐하면 일반적으로 사용할 때 별칭을 사용 SELECT하고 다른 진술을 사용했기 때문에 익숙한 것을 본능적으로 수행하고 왜 제대로 작동하지 않는지 궁금했습니다.
Ricardo Altamirano 2016 년

41
+1 OP의 경우 앨리어싱이 필요하지 않을 수도 있지만 EXISTS 절을 사용했기 때문에 도움이되었으므로 두 쿼리를 함께 묶을 수 있도록 테이블의 별칭을 지정해야했습니다.
리카르도

4
기존 SELECT 쿼리를 가져 와서 앨리어싱을 다시 쓰지 않고도 빠르게 DELETE 문으로 바꿀 때 해결책을 찾고있었습니다.
알렉스

4
이것이 중요한 사용 사례의 예; 거기에 (즉, 너무 관여 여러 열에있는 두 번째 테이블의 내용을 기반으로 및 삭제 in또는 not in것없는 작업 :DELETE f from dbo.foods as f where not exists (select top 1 1 from animalDiets a where a.AnimalId = f.AnimalId and a.DietId = f.DietId)
JohnLBevan

3
별명을 사용한 삭제는 테이블에서 삭제하고 싶지만 행 세트를 줄이려면 해당 테이블을 다른 테이블 / 뷰에 조인해야 할 때 유용합니다. 예delete o from Order as o inner join Customer as c on c.CustomerID = o.CustomerID where c.ArchiveOrders = 1
Andrew Jens

74

delete 문에 이상한 구문이 있습니다. 다음과 같이 진행됩니다.

DELETE f FROM foods f WHERE (f.name IN ('chickens', 'rabbits'))

1
@Ricardo만의 차이점은 스키마입니다. 그러나 시간은 둘 다 동시에 게시되었음을 시사합니다.
Mukus
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.