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;