subquery
あなたのコードを持っているが呼び出され、派生テーブル。これはベーステーブルではなく、クエリの実行中に「存続する」テーブルです。ビュー(ビューテーブルとも呼ばれます)と同様に、最近のバージョンでは、クエリ内のテーブルを「定義」する別の4番目の方法であるCTEは、多くの点でテーブルに似ています。あなたはすることができselect
、そこから、あなたはそれらを使用することができますfrom
かにjoin
他のテーブルにそれら(ベース又はません!)。
一部のDBMSでは(すべてのDBMSがこれを同じ方法で実装しているわけではありません)、これらのテーブル/ビューは更新可能です。また、我々はできることと、「更新可能」とはupdate
、insert
中またはdelete
それらから。
ただし、制限があり、これは予想されています。subquery
が2(または17個のテーブル)の結合であったと想像してください。どういうdelete
意味でしょうか?(どのテーブルから行を削除する必要がありますか?)更新可能なビューは非常に複雑な問題です。関係理論の有名な専門家であるクリス・デイトによって書かれた最近の(2012年の)本(完全にこの主題に関する):ビューの更新と関係理論があります。
派生テーブル(またはビュー)が非常に単純なクエリである場合、ベーステーブルが1つだけで(aによって制限される場合がありますWHERE
)、noのGROUP BY
場合、派生テーブルのすべての行は基礎となるベーステーブルの1行に対応するため、簡単*このからの更新、挿入または削除します。
サブクエリ内のコードがより複雑な場合、派生テーブル/ビューの行を、基礎となるベーステーブルのいずれかの行にトレース/解決できるかどうかに依存します。
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
WITH CHECK OPTION
句とともにビューのselect_statementのどこにも使用されません。
前述の制限FROM
は、ビュー自体に適用されるのと同様に、ビューの句内のすべてのサブクエリに適用されます。一般に、データベースエンジンは、ビュー定義から1つのベーステーブルへの変更を明確にトレースできる必要があります。
実際にdelete
はの方が簡単で、より複雑ではありませんupdate
。SQL Serverに必要なのは、削除するベーステーブルの行を識別するための主キーまたはその他の方法のみです。ためにupdate
、我々は計算列を更新できないことを(むしろ明白な)追加の制限があります。クエリを変更して更新を試みることができます。更新CreatedDateTime
はおそらく問題なく動作しますが、計算RowNumber
列を更新しようとするとエラーが発生します。そしてinsert
、私たちが持っていないベーステーブルのすべての列に値を指定する必要があるだろうとして、さらに複雑であるDEFAULT
制約を。