DB2の一時テーブルに選択

T-SQLの経験が豊富ですが、まだ初心者であるという点で、この質問の前置きをさせてください。 DB2になります。

ルートクエリはおおよそ次のようになります:

Select Col1, Col2, Col3 From ( Select A.Col1, B.Col2, B.Col3 From SchemaA.TableA as A Inner Join SchemaA.TableB as B On A.Id = B.ParentId Where A.Col2 = "TypeValue" Fetch First 5 Rows Only -- This is not allowed in a union or sub select Union Select A.Col1, B.Col2, B.Col3 From SchemaB.TableA as A Inner Join SchemaB.TableB as B On A.Id = B.ParentId Where A.Col2 = "TypeValue" Fetch First 5 Rows Only -- This is not allowed in a union or sub select ) as Hybrid 

Fetch First X Rowsは副選択またはユニオンでは許可されていないため、これは機能しません。出力を制限しているため、入力を制限することは理にかなっています。

偽のユニオンを実現できると思います。代わりに副選択を一時テーブルにフィードし、代わりにその出力を返すことによって。

T-SQLでは、次のようなクエリを使用して一時テーブルをその場で作成できます。DB2でそれを行うにはどうすればよいですか?

Select * Into #Temp From TableA 

DB2でそれを行うにはどうすればよいですか?または、データをテーブルに挿入する前にテーブルを作成する必要がありますか?

コメント

  • 使用しているDb2のバージョンは何ですか?
  • ステートメントをバックアップするソースも含めてください:これはユニオンまたはサブセレクトでは許可されていません

回答

クエリによる順序がないと、実際には意味がありません(IMHO)。ただし、それでも次のようなクエリを使用できます。

select * from ( select A.x from A order by x fetch first 2 rows only ) union all ( select B.x from B order by x fetch first 3 rows only ) ; 

フィドル

回答

これは、2つのそれぞれにCTEを使用することで解決できると思います

テーブルSYSIMB.TABLESとSYSIBM.VIEWSを結合して、例を作成しました。両方から最初の5行のみをフェッチします。

WITH tables ( name ) AS (SELECT tab.name FROM sysibm.SYSTABLES tab FETCH FIRST 5 rows only ) , views ( name ) AS (SELECT vie.name FROM sysibm.SYSVIEWS vie FETCH FIRST 5 rows only ) SELECT name FROM tables UNION SELECT name FROM views; 

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です