subquery
코드에서 당신이이라고 파생 테이블 . 기본 테이블이 아니라 쿼리가 실행되는 동안 "존재하는"테이블입니다. 같이 보기 (도라고 볼 테이블 ) - 최근 버전에서 CTE는 또 다른, 4 방법 쿼리 안에 테이블을 "정의"- 그들은 여러 가지면에서 테이블과 유사하다. 당신은 select
그들에게서 할 수 있고, 다른 테이블 에서 사용 from
하거나 join
다른 테이블 에 사용할 수 있습니다 (기본 또는 아닙니다!).
일부 DBMS에서 (모든 DBMS가 동일한 방식으로 구현 한 것은 아님) 이러한 테이블 / 뷰를 업데이트 할 수 있습니다. 우리는 또한 수 그리고 "갱신"수단 update
, insert
로 또는 delete
그들로부터.
그러나 제한 사항이 있으며 이는 예상 된 것입니다. subquery
가 2 (또는 17 개의 테이블)의 조인 인 경우를 상상해보십시오 . 그러면 무엇을 delete
의미할까요? (어떤 테이블에서 행을 삭제해야합니까?) 업데이트 가능한 뷰는 매우 복잡한 문제 입니다. 관계 이론에 대한 잘 알려진 전문가 인 크리스 데이트 (Chris Date)가 쓴이 주제에 관한 최근의 (2012 년) 저서가있다 : 업데이트 및 관계 이론 .
파생 테이블 (또는 뷰)이 하나의 기본 테이블 (으로 제한됨 WHERE
) 만 있고 no와 같이 매우 간단한 쿼리 GROUP BY
인 경우 파생 테이블의 모든 행이 기본 기본 테이블의 한 행에 해당하므로 easy * 업데이트, 삽입 또는 삭제
하위 쿼리 내부의 코드가 더 복잡한 경우 파생 된 테이블 / 뷰의 행을 기본 기본 테이블 중 하나의 행으로 추적 / 해결할 수 있는지 여부에 따라 달라집니다.
SQL Server의 경우 MSDN의 업데이트 가능한 뷰 단락에서 자세한 내용을 읽을 수 있습니다 CREATE VIEW
.
업데이트 가능한 뷰
다음 조건이 충족되는 한 뷰를 통해 기본 테이블의 데이터를 수정할 수 있습니다.
모든 포함하여 수정 UPDATE
, INSERT
그리고 DELETE
단 하나 개의 기본 테이블에서 문, 반드시 참조 열.
뷰에서 수정중인 열은 테이블 열의 기본 데이터를 직접 참조해야합니다. 다음과 같은 다른 방법으로는 열을 파생시킬 수 없습니다.
집계 함수 : AVG
, COUNT
, SUM
, MIN
, MAX
, GROUPING
, STDEV
, STDEVP
, VAR
,와 VARP
.
계산. 다른 열을 사용하는 식에서 열을 계산할 수 없습니다. 집합 연산자를 사용하여 형성되는 열을 UNION
, UNION ALL
, CROSSJOIN
, EXCEPT
, 및 INTERSECT
계산에 양 및도 갱신되지 않는다.
열은 영향을받지 않습니다 수정하고 GROUP BY
, HAVING
또는 DISTINCT
절.
TOP
뷰의 select_statement에서 WITH CHECK OPTION
절 과 함께 사용되지 않습니다 .
이전 제한 사항 FROM
은 뷰 자체에 적용되는 것처럼 뷰 절의 하위 쿼리에 적용됩니다. 일반적으로 데이터베이스 엔진은보기 정의에서 하나의 기본 테이블로 수정 사항을 명확하게 추적 할 수 있어야합니다.
실제로 delete
보다 쉽고 복잡하지 않습니다 update
. SQL Server는 기본 키 또는 기본 테이블의 어떤 행을 삭제할지를 식별하는 다른 방법 만 필요합니다. 의 경우 update
계산 열을 업데이트 할 수 없다는 추가 제한이 있습니다. 쿼리를 수정하여 업데이트를 시도 할 수 있습니다. 를 업데이트하면 CreatedDateTime
정상적으로 작동하지만 계산 된 RowNumber
열 을 업데이트하려고 하면 오류가 발생합니다. 그리고 insert
우리는이없는 기본 테이블의 모든 열 값을 제공해야 할 것 같은 더 복잡한 DEFAULT
제약 조건을.