Wybierz opcję Do tabeli tymczasowej w DB2

Przedmówię się do tego pytania, ponieważ mam dobre doświadczenie w T-SQL, ale nadal jestem nowicjuszem, kiedy chodzi o DB2.

Zapytanie roota wygląda mniej więcej tak:

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 

Ponieważ Fetch First X Rows jest niedozwolone w selekcji podrzędnej lub unii, to nie zadziała. Ponieważ ograniczamy wyjście, sensowne jest ograniczenie wejścia.

Myślę, że mogę uzyskać fałszywą sumę przekazując moje podselekcje do tabel tymczasowych zamiast tego i zwracając te dane wyjściowe.

W T-SQL mogę utworzyć tabelę tymczasową w locie za pomocą zapytania takiego jak to, jak to zrobić w DB2?

Select * Into #Temp From TableA 

Jak mam to zrobić w DB2? A może muszę utworzyć tabelę przed wstawieniem do niej danych?

Komentarze

  • Jakiej wersji Db2 używasz?
  • Czy możesz również dołączyć źródło, z którego pochodzi kopia zapasowa Twojego oświadczenia: Nie jest to dozwolone w przypadku unii lub podwyboru .

Odpowiedź

Bez zamówienia przez zapytanie nie ma to sensu (IMHO). Niemniej jednak nadal możesz użyć zapytania takiego jak:

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

Stworzyłem mały przykład do zabawy w Skrzypce

Odpowiedź

Myślę, że można to rozwiązać, używając CTE dla każdego z dwóch wybiera.

Utworzyłem dla Ciebie przykład, łącząc tabele SYSIMB.TABLES i SYSIBM.VIEWS. Z obu pobieram tylko pierwsze 5 wierszy.

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; 

Dodaj komentarz

Twój adres email nie zostanie opublikowany. Pola, których wypełnienie jest wymagane, są oznaczone symbolem *