Dovolte mi předmluvu k této otázce, protože i když mám silné zázemí v T-SQL, ale jsem stále jen nováček, když jde o DB2.
Kořenový dotaz vypadá zhruba takto:
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
Protože Fetch First X Rows
není povolen v dílčích výběrech nebo v odborech, to nebude fungovat. Protože omezujeme výstup, má smysl omezit vstup.
Myslím, že mohu dosáhnout falešného spojení tím, že místo toho vložím své podvýběry do dočasných tabulek a místo toho vrátím tento výstup.
V T-SQL mohu za běhu vytvořit dočasnou tabulku s dotazem, jako je tento, jak bych to udělal v DB2?
Select * Into #Temp From TableA
Jak bych to udělal v DB2? Nebo musím před vložením dat do ní vytvořit tabulku?
Komentáře
- Jakou verzi Db2 používáte?
- Můžete prosím uvést také zdroj, který zálohuje vaše prohlášení: Toto není povoleno v unii nebo dílčím výběru .
odpověď
Bez objednávky podle vašeho dotazu nemá smysl (IMHO). Stále však můžete použít dotaz jako:
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 ) ;
Vytvořil jsem pro vás malý příklad, se kterým si můžete zahrát na Fiddle
Odpověď
Myslím, že to lze vyřešit použitím CTE pro každou ze dvou vybere.
Vytvořil jsem pro vás příklad spojením tabulek SYSIMB.TABLES a SYSIBM.VIEWS. Z obou načítám pouze prvních 5 řádků.
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;