Vælg ind i en temp-tabel i DB2

Lad mig forord dette spørgsmål, mens jeg har en stærk baggrund i T-SQL, men jeg er stadig bare en nybegynder, når det kommer til DB2.

Rodforespørgslen ser stort set sådan ud:

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 

Fordi Fetch First X Rows er ikke tilladt i undervalg eller med fagforeninger, dette fungerer ikke. Da vi begrænser output, er det fornuftigt at begrænse input.

Jeg regner med, at jeg kan opnå en falsk union ved at indføre mine underselekter i temp-tabeller i stedet og returnere output i stedet.

I T-SQL kan jeg oprette en temp-tabel i farten med en forespørgsel som denne, hvordan ville jeg gøre det i DB2? p>

Select * Into #Temp From TableA 

Hvordan ville jeg gøre det i DB2? Eller skal jeg oprette tabellen, før jeg indsætter data i den?

Kommentarer

  • Hvilken version af Db2 bruger du?
  • Kan du også medtage kilden, der sikkerhedskopierer din erklæring: Dette er ikke tilladt i en fagforening eller undervalg .

Svar

Uden en ordre fra din forespørgsel giver det ikke rigtig mening (IMHO). Men alligevel kan du stadig bruge en forespørgsel som:

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

Jeg lavede et lille eksempel for dig at lege med på Fiddle

Answer

Jeg tror, dette kan løses ved at bruge en CTE til hver af de to vælger.

Jeg oprettede et eksempel til dig ved at slutte dig til tabellerne SYSIMB.TABLES og SYSIBM.VIEWS. Fra begge henter jeg kun de første 5 rækker.

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; 

Skriv et svar

Din e-mailadresse vil ikke blive publiceret. Krævede felter er markeret med *