Selecteer in een tijdelijke tabel in DB2

Laat me deze vraag inleiden, terwijl ik een sterke achtergrond heb in T-SQL, maar ik ben nog steeds maar een beginneling als het komt op DB2.

De root-query ziet er ongeveer zo uit:

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 

Omdat Fetch First X Rows is niet toegestaan in subselecties of met vakbonden, dit gaat niet “werken. Aangezien we de output beperken, is het logisch om de input te beperken.

Ik denk dat ik een nep-unie kan bereiken door mijn subselecties in plaats daarvan in temp-tabellen in te voeren en in plaats daarvan die uitvoer te retourneren.

In T-SQL kan ik direct een tijdelijke tabel maken met een query als deze, hoe zou ik dat doen in DB2?

Select * Into #Temp From TableA 

Hoe zou ik dat doen in DB2? Of moet ik de tabel maken voordat ik er gegevens in plaats?

Opmerkingen

  • Welke versie van Db2 gebruikt u?
  • Kunt u alstublieft ook de bron opnemen die uw verklaring ondersteunt: Dit is niet toegestaan in een vakbond of subselectie .

Antwoord

Zonder een bestelling op uw vraag heeft het niet echt zin (IMHO). Maar toch kun je nog steeds een zoekopdracht gebruiken als:

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 ) ; 

Ik heb een klein voorbeeld gemaakt om mee te spelen op Fiddle

Answer

Ik denk dat dit kan worden opgelost door een CTE te gebruiken voor elk van de twee selecteert.

Ik heb een voorbeeld voor je gemaakt door me aan te sluiten bij de tabellen SYSIMB.TABLES en SYSIBM.VIEWS. Van beide haal ik alleen de eerste 5 rijen op.

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; 

Geef een reactie

Het e-mailadres wordt niet gepubliceerd. Vereiste velden zijn gemarkeerd met *