Permítanme comenzar esta pregunta en el sentido de que aunque tengo una sólida experiencia en T-SQL pero todavía soy un novato cuando se trata de DB2.
La consulta raíz se ve más o menos así:
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
Porque Fetch First X Rows
no está permitido en subselecciones o con uniones, esto no va a funcionar. Ya que estamos limitando la salida, tiene sentido limitar la entrada.
Me imagino que puedo lograr una unión falsa introduciendo mis subselecciones en tablas temporales y devolviendo esa salida en su lugar.
En T-SQL, puedo crear una tabla temporal sobre la marcha con una consulta como esta, ¿cómo haría eso en DB2?
Select * Into #Temp From TableA
¿Cómo haría eso en DB2? ¿O tendría que crear la tabla antes de insertar datos en ella?
Comentarios
- ¿Qué versión de DB2 está utilizando?
- ¿Puede incluir también la fuente que respalda su declaración: Esto no está permitido en una unión o sub selección .
Respuesta
Sin un orden por su consulta realmente no tiene sentido (en mi humilde opinión). Sin embargo, aún puedes usar una consulta como:
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 ) ;
Inventé un pequeño ejemplo para que juegues en Fiddle
Respuesta
Creo que esto se puede resolver usando un CTE para cada uno de los dos selecciona.
Creé un ejemplo para ti uniendo las tablas SYSIMB.TABLES y SYSIBM.VIEWS. De ambos, obtengo solo las primeras 5 filas.
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;