Sélectionnez Dans une table temporaire dans DB2

Permettez-moi de faire précéder cette question car jai une solide expérience en T-SQL mais je ne suis encore quun débutant quand il sagit de DB2.

La requête racine ressemble à peu près à ceci:

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 

Parce que Fetch First X Rows nest pas autorisé dans les sous-sélections ou avec les unions, cela ne fonctionnera pas. Puisque nous limitons la sortie, il est logique de limiter lentrée.

Je suppose que je peux réaliser une fausse union en alimentant mes sous-sélections dans des tables temporaires à la place et en renvoyant cette sortie à la place.

Dans T-SQL, je peux créer une table temporaire à la volée avec une requête comme celle-ci, comment puis-je faire cela dans DB2?

Select * Into #Temp From TableA 

Comment puis-je faire cela dans DB2? Ou est-ce que je dois créer le tableau avant dy insérer des données?

Commentaires

  • Quelle version de Db2 utilisez-vous?
  • Pouvez-vous également inclure la source qui soutient votre déclaration: Ceci nest pas autorisé dans un syndicat ou sous-sélection .

Réponse

Sans un ordre par votre requête na pas vraiment de sens (IMHO). Mais néanmoins vous pouvez toujours utiliser une requête comme:

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

Jai créé un petit exemple avec lequel vous pouvez jouer à Fiddle

Réponse

Je pense que cela peut être résolu en utilisant un CTE pour chacun des deux selects.

Jai créé un exemple pour vous en joignant les tables SYSIMB.TABLES et SYSIBM.VIEWS. Des deux, je récupère uniquement les 5 premières lignes.

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; 

Laisser un commentaire

Votre adresse e-mail ne sera pas publiée. Les champs obligatoires sont indiqués avec *