Hitachi

ノンストップデータベース HiRDB Version 9 SQLリファレンス


2.21.1 内部導出表の条件

(1)〜(10)に示す名前付きの導出表を,問合せ指定のFROM句に指定した場合,内部導出表を作成する条件は,次のようになります。

〈この項の構成〉

(1) SELECT DISTINCTを指定して導出する名前付きの導出表の場合

名前付きの導出表が副問合せ中に含まれる。又は,名前付きの導出表をFROM句に指定した問合せ指定が次のどれかを直接含んでいる。

(例)

「SELECT DISTINCT C1,C2 FROM T1」によって導出されている名前付きの導出表V1(ビュー表),Q1(WITH句の問合せ名)をFROM句に指定する場合,次に示す記述をするとV1に対して内部導出表を作成します。

例1:
SELECT * FROM T2 WHERE EXISTS(SELECT * FROM V1)
 
例2:
SELECT VC1,VC2 FROM V1 GROUP BY VC1,VC2
 
例3:
WITH Q1(QC1,QC2) AS (SELECT DISTINCT C1,C2 FROM T1)
    SELECT DISTINCT * FROM Q1
 
例4:
SELECT X.VC1,Y.C1 FROM V1 X,T2 Y WHERE X.VC1=Y.C2
 
例5:
SELECT V1.VC1,T2.C2 FROM V1 LEFT JOIN T2 ON T2.C2=V1.VC2
 
例6:
WITH Q1(QC1,QC2) AS (SELECT DISTINCT C1,C2 FROM T1)
    SELECT QC1+100,CURRENT_DATE FROM Q1
 
例7:
SELECT VC1,(SELECT C1 FROM T2) FROM V1
 
例8:
SELECT VC1 FROM V1
 
例9:
SELECT VC1,VC2 FROM V1 ORDER BY 1
 
例10:
INSERT INTO T2 SELECT NEXT VALUE FOR SEQ1,VC1,VC2 FROM V1

(2) GROUP BY句,HAVING句,又は集合関数を指定して導出する名前付きの導出表の場合

名前付きの導出表をFROM句に指定した問合せ指定が,次のどれかを直接含んでいる。

(例)

「SELECT C1,C2 FROM T1 GROUP BY C1,C2」によって導出されている名前付きの導出表V1(ビュー表),Q1(WITH句の問合せ名)及び「SELECT MAX(C1),C2 FROM T1 GROUP BY C2 HAVING C2<100」によって導出されている名前付きの導出表V2(ビュー表)をFROM句に指定する場合,次に示す記述をするとV1,V2,Q2に対して内部導出表を作成します。

例1:
WITH Q1(QC1,QC2) AS (SELECT C1,C2 FROM T1 
  GROUP BY C1,C2) SELECT AVG(QC1),QC2 FROM Q1
    GROUP BY QC2
 
例2:
SELECT V1.VC1,V2.VC1 FROM V1,V2 WHERE V1.VC1=V2.VC1
 
例3:
WITH Q1(QC1,QC2) AS (SELECT C1,C2 FROM T1 
  GROUP BY C1,C2)
  SELECT Q1.QC1,V1.VC1 FROM Q1 INNER JOIN V1 ON V1.VC2=Q1.QC2
 
例4:
SELECT COUNT(*) OVER(),C1 FROM V1
 
例5:
INSERT INTO T2 SELECT NEXT VALUE FOR SEQ1,VC1,VC2 FROM V1

(3) 選択式に列指定以外の値式を指定して導出する名前付きの導出表の場合

名前付きの導出表をFROM句に指定した問合せ指定が,次のどれかを直接含んでいる。

注※

グループ分け高速化機能が有効な場合を除きます。ただし,選択式にコンポネント指定を指定して導出する名前付き導出表については,グループ分け高速化機能を適用しません。グループ分け高速化機能については,マニュアル「HiRDB Version 9 UAP開発ガイド」を参照してください。

(例)

「SELECT C1+100,C2||C2 FROM T1」によって導出されている名前付きの導出表 V1(ビュー表),Q1(WITH句の問合せ名)をFROM句に指定する場合,次に示す記述をするとV1,Q1に対して内部導出表を作成します。

例1:
SELECT AVG(VC1),VC2 FROM V1 GROUP BY VC2
 
例2:
SELECT * FROM V1 LEFT JOIN T2 ON T2.C2=V1.VC2
 
例3:
WITH Q1(QC1,QC2) AS (SELECT C1+100,C2||C2 FROM T1)
  SELECT QC1,QC2 FROM Q1 GROUP BY QC1,QC2 HAVING QC1<=100
 
例4:
SELECT COUNT(*) OVER(),VC1 FROM V1

(4) DISTINCT指定の集合関数を指定して導出する名前付きの導出表の場合

名前付きの導出表をFROM句に指定した問合せ指定が,次のどれかを直接含んでいる。

(例)

「SELECT AVG(DISTINCT C1) FROM T1」によって導出されている名前付きの導出表V1(ビュー表)をFROM句に指定する場合,次に示す記述をするとV1に対して内部導出表を作成します。

SELECT DISTINCT VC1 FROM V1
WITH Q1(C1) AS (SELECT AVG(DISTINCT C1) FROM T1)
  SELECT COUNT(*) OVER(),C1 FROM Q1

(5) 表の結合を指定して導出する名前付きの導出表の場合

名前付きの導出表が,外結合,内結合,又は交差結合の表参照に指定されている。

(例)

「SELECT T1.C1,T2.C1 FROM T1,T2」で導出されている名前付きの導出表V1(ビュー表),Q1(WITH句の問合せ名)をFROM句に指定する場合,次に示す記述をするとV1,Q1に対して内部導出表を作成します。

例1:
SELECT V1.* FROM V1 LEFT JOIN T3 ON T3.C1=V1.VC1
 
例2:
WITH Q1(QC1,QC2) AS (SELECT T1.C1,T2.C1 FROM T1,T2)
  SELECT * FROM Q1 INNER JOIN T3 ON Q1.QC1=T3.C1

(6) 外結合,内結合,又は交差結合を指定して導出する名前付きの導出表の場合

名前付きの導出表をFROM句に指定した問合せ指定が,表の結合を直接含んでいる。

(例)

「SELECT T1.C1,T2.C1 FROM T1 LEFT JOIN T2 ON T1.C2=T2.C2」で導出されている名前付きの導出表V1(ビュー表),Q1(問合せ名)をFROM句に指定する場合,次に示す記述をするとV1,Q1に対して内部導出表を作成します。

例1:
SELECT V1.VC1,T3.C1 FROM V1 LEFT JOIN T3 ON T3.C2=V1.VC2
 
例2:
WITH Q1(QC1,QC2) AS (SELECT T1.C1,T2.C1 FROM T1 LEFT JOIN T2
  ON T1.C2=T2.C2) SELECT Q1.QC1 FROM Q1 INNER JOIN T3 ON T3.C2=Q1.QC2

(7) 選択式に副問合せを含む値式を指定して導出する名前付きの導出表の場合

名前付きの導出表をFROM句に指定した問合せ指定が,次のどれかを直接含んでいる。

(例)

「SELECT (SELECT C1 FROM T2),C1 FROM T1」によって導出されている名前付きの導出表V1(ビュー表),Q1(導出問合せ名)をFROM句に指定する場合,次に示す記述をすると,V1,Q1に対して内部導出表を作成します。

例1:
SELECT VC1,VC2 FROM V1 WHERE VC1>0
 
例2:
WITH Q1(QC1,QC2) AS (SELECT (SELECT C1 FROM T2),C1 FROM T1)
  SELECT QC1,QC2 FROM Q1 WHERE QC1>0

(8) 集合演算によって導出する名前付きの導出表の場合

次のどれかの条件を満たす。

  1. 集合演算の演算項のどれかに,次に示すどれかを直接含む。

    • 内部導出表の問合せ

    • 導出表を指定した問合せ

  2. 集合演算の演算項のどれかと,名前付きの導出表に対する問合せが,(1)〜(7)に示したどれかの条件を満たす。

  3. UNION ALL以外を含む集合演算か,UNION ALLだけを含む集合演算かどうかによって(9)又は(10)の条件を満たす。

(例)

「SELECT (SELECT C1 FROM T2),C2 FROM T1 UNION SELECT C1,C2 FROM T3」によって導出されている名前付きの導出表V1(ビュー表),Q1(導出問合せ名)をFROM句に指定する場合,V1,Q1に対する問合せでは内部導出表を作成します。

例1:
SELECT * FROM V1
 
例2:
WITH Q1(QC1,QC2) AS (
  SELECT (SELECT C1 FROM T2),C2 FROM T1 UNION SELECT C1,C2 FROM T3)
  SELECT * FROM Q1

(9) UNION ALL以外を含む集合演算によって導出する名前付きの導出表の場合

次のどれかを満たす。

  1. 名前付きの導出表をFROM句に指定した問合せ指定が,次のどれかを直接含む。

    • GROUP BY句,HAVING句,又は集合関数

    • SELECT DISTINCT

    • 表の結合(コンマの結合を指定している場合を含む)

    • WHERE句

    • 副問合せ

    • 選択式に列指定以外の値式

    • 名前付きの導出表の全列を,選択式に1回ずつ指定していない

    • NEXT VALUE式

    • WRITE指定

    • GET_JAVA_STORED_ROUTINE_SOURCE指定

    • 選択項目にない列をソート項目として指定

  2. 集合演算によって導出する名前付きの導出表の場合」の条件を満たす。

(例)

「SELECT C1,C2 FROM T1 UNION SELECT C1,C2 FROM T2」によって導出されている名前付きの導出表V1(ビュー表),Q1(問合せ名)をFROM句に指定する場合,次に示す記述をすると,V1,Q1に対して内部導出表を作成します。

例1:
SELECT C1,C2 FROM V1 GROUP BY C1,C2
 
例2:
WITH Q1(QC1,QC2) AS (SELECT C1,C2 FROM T1 UNION SELECT C1,C2 FROM T2)
  SELECT QC1,QC2 FROM Q1,T3 WHERE QC1=T3.C1
 
例3:
INSERT INTO T2 SELECT NEXT VALUE FOR SEQ1, VC1, VC2 FROM V1

(10) UNION ALLだけの集合演算によって導出する名前付きの導出表の場合

次のどれかを満たす。

  1. 名前付きの導出をFROM句に指定した問合せ指定が,次に示すどれかを直接含む。

    • GROUP BY句,HAVING句,集合関数

    • ウィンドウ関数

    • WHERE句,副問合せ(ただし(1)の問合せが,副問合せ,集合演算の演算項,INSERT文の問合せ式本体のどれかに含まれる場合だけ)

    • 関数呼出し

    • システム定義スカラ関数

    • コンポネント指定

    • WRITE指定

    • GET_JAVA_STORED_ROUTINE_SOURCE指定

    • 選択項目にない列をソート項目として指定

    • 集合演算によって導出した名前付きの導出表を,FROM句に指定した副問合せ

    • 導出表を指定した副問合せ

    • GROUP BY句に列指定以外の値式を指定した副問合せ

    • 次のどれかを指定した副問合せ

      ・関数呼出し

      ・システム定義スカラ関数

      ・コンポネント指定

    • 選択式に指定したSQL変数,SQLパラメタ,関数呼出しのうち,データ型が次に示すどれかとなるもの

      BLOB型

      32001バイト以上のBINARY型

      抽象データ型

      BOOLEAN型

  2. 名前付きの導出表を表の結合に指定した問合せ指定に,次のどれかを指定している。

    • 名前付きの導出表を指定した表参照に交差結合を指定している

    • 名前付きの導出表を指定した表参照に右外結合,左外結合の両方を指定している

    • 名前付きの導出表を,左外結合の一番左側の外表以外の表参照に指定している

    • 名前付きの導出表を,右外結合の一番右側の外表以外の表参照に指定している

    • 名前付きの導出表を指定したFROM句に,コンマの結合を指定している(すなわち,その名前付き導出表を指定した結合表以外に,別の表参照を指定している)

    • 副問合せ又は導出表を指定している

    • 問合せ指定が,副問合せ又は集合演算の演算項に含まれる

    • 名前付きの導出表を導出する集合演算項に,次のどれかを含む

      ・表の結合

      ・GROUP BY句,HAVING句,又は集合関数

      ・SELECT DISTINCT

      ・選択式に列指定以外の値式

      ・内部導出表を生成する問合せ

      ・導出表を指定した問合せ

    • 名前付きの導出表のほかに,集合演算を指定して導出した名前付きの導出表を指定している

    • 名前付きの導出表を指定した結合表の表参照に,次のどれかを指定している

      ・表の結合を指定して導出した名前付きの導出表

      ・GROUP BY句,HAVING句,又は集合関数を指定して導出した名前付きの導出表

      ・SELECT DISTINCTを指定して導出した名前付きの導出表

      ・選択式に列指定以外の値式を指定して導出した名前付きの導出表

      ・内部導出表を生成する問合せを指定して導出した名前付きの導出表

      ・導出表を指定して導出した名前付きの導出表

      ・副問合せを指定して導出した名前付きの導出表

    • 次に示す式によって得られる表の総数が,65を超える

      表の総数=(名前付き導出表を導出する表の延べ数)

          +(名前付き導出表を導出する集合演算の数+1)

          ×(外結合の右側に指定する表の延べ数)

          +(名前付き導出表を指定した問合せ以外にも問合せを指定している場合,その問合せに指定した表の延べ数)

  3. 集合演算によって導出する名前付きの導出表の場合」の条件を満たす。

(例)

「SELECT C1,C2 FROM T1 UNION ALL SELECT C1,C2 FROM T2」によって導出されている名前付きの導出表V1(ビュー表),Q1(問合せ名)をFROM句に指定する場合,次に示す記述をすると,V1,Q1に対して内部導出表を作成します。

例1:
SELECT C1,C2 FROM V1 GROUP BY C1,C2
 
例2:
WITH Q1(QC1,QC2) AS (SELECT C1,C2 FROM T1 UNION ALL SELECT C1,C2 FROM T2)
  SELECT QC1,QC2 FROM Q1,T3 WHERE QC1=T3.C1
 
例3:
SELECT * FROM T1 WHERE EXISTS(SELECT * FROM V1 WHERE V1.C1=T1.C1)
 
例4:
INSERT INTO T3 SELECT * FROM V1 WHERE C1>'C001'