SQL Server 2008에서 테이블 별칭으로 UPDATE SQL을 작성하는 방법은 무엇입니까?


213

나는 매우 기본이 있습니다 UPDATE SQL-

UPDATE HOLD_TABLE Q SET Q.TITLE = 'TEST' WHERE Q.ID = 101;

이 쿼리는 Oracle, Derby에서 잘 실행 MySQL되지만 SQL Server 2008 에서는 다음 오류로 실패합니다 .

"메시지 102, 수준 15, 상태 1, 줄 1 'Q'근처에 잘못된 구문입니다."

SQL에서 별명 "Q"를 모두 제거하면 작동합니다.

그러나 별칭을 사용해야합니다.


5
별명을 사용해야하는 이유는 무엇입니까? 필요한 것 같지 않습니다.
Mark Byers

5
예-프로그래밍 측면에서 필요하지 않습니다. 그러나 테이블 별칭으로 모든 종류의 DML SQL을 생성하는 기존 / 이전 라이브러리가 있습니다. 라이브러리에는 복잡한 논리를 가진 많은 클래스가 있습니다. 이제 라이브러리에서 테이블 별칭을 제거하는 것은 MSSQL에서 작동하도록 기존 논리를 조정하는 것보다 더 많은 작업입니다. 또한 여러 테이블이 관련된 경우 테이블 별칭이 필요합니다.
javauser71

답변:


422

SQL Server의 업데이트 문에서 별칭을 사용하는 구문은 다음과 같습니다.

UPDATE Q
SET Q.TITLE = 'TEST'
FROM HOLD_TABLE Q
WHERE Q.ID = 101;

여기서 별명은 필요하지 않습니다.


2
예 !!! 효과가있다. 빠른 응답 감사합니다. MSSQL 서버가 왜 이러한 비 전통적인 업데이트 구문을 지원하는지 알고 있습니까?
javauser71

3
마크 바이어-큰 답변 !! 이 구문을 사용하면 주석 처리 된 Select 문을 추가 할 수 있습니다.이를 통해 먼저 select (선택 및 강조 표시에서 강조 표시)를 수행하여 업데이트를 테스트 할 수 있습니다.SET Q.TITLE = 'TEST' -- SELECT *

2
좋은. 따라서 where 절에서 인텔리전스를보다 쉽게 ​​사용할 수 있습니다.
Magnus

별명이 아닙니다. 이것은 정규화 된 'table.column'이름입니다. :-/
ScottWelker

18

항상 CTE (공통 테이블 형식) 접근 방식을 사용할 수 있습니다.

;WITH updateCTE AS
(
    SELECT ID, TITLE 
    FROM HOLD_TABLE
    WHERE ID = 101
)

UPDATE updateCTE
SET TITLE = 'TEST';

예-작동합니다. 그러나 JDBC / Java 프로그램의 경우 일종의 복잡한 구문입니다. 답변 주셔서 감사합니다.
javauser71

-1

Postgres의 특수 사례

위의 솔루션 목록이 작동하지 않습니다. Postgres를위한 솔루션

내가 불을 질렀을 때

UPDATE table Q SET Q.is_active = FALSE ,Q.is_delete = TRUE WHERE Q.name = 'XYZ';

결과 : 오류 : "table"관계의 "q"열이 없습니다.

해결책 SET 데이터 값에 allis를 사용할 필요가 없습니까?

UPDATE table Q SET is_active = FALSE ,is_delete = TRUE WHERE Q.name = 'XYZ';

안녕하세요 Ronak, Postgres에 대한 답변을 하향 조정하고 이미 위의 T-SQL에 대한 작동 솔루션이 있습니다.
Alpi Murányi

hii @ AlpiMurányi 내 경우에 작동하는 솔루션을 제안 할 수 있습니까? 구현할 수 있도록 이미 답변에 오류를 언급했습니다
Ronak Patel
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.