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.