2010-05-22 31 views
6

Un SELECT sin una cláusula FROM nos lleva a varias columnas sin consultar una tabla:¿Es posible tener una selección sin tabla con varias filas?

SELECT 17+23, REPLACE('bannanna', 'nn', 'n'), RAND(), CURRENT_TIMESTAMP; 

¿Cómo podemos escribir una consulta que se traduce en múltiples filas sin hacer referencia a una tabla? Básicamente, abuse SELECT para convertirlo en una declaración de definición de datos. El resultado podría tener una sola columna o varias columnas.

Estoy muy interesado en una respuesta neutral DBMS, pero otros (por ejemplo, basados ​​en UNPIVOT) son bienvenidos. Me gustaría recopilar tantas formas de hacer esto como sea posible. No hay una aplicación técnica detrás de esta pregunta; es más teórico que práctico.

Respuesta

12

Utilice un UNION:

SELECT 1 
UNION 
SELECT 2 

es la siguiente con MySQL:

+---+ 
| 1 | 
+---+ 
| 1 | 
| 2 | 
+---+ 

Uso UNION ALL para evitar la pérdida de filas no únicos.

+0

Tenía la esperanza de conseguir un poco más fuera de allí respuestas antes de que alguien dejó caer la bomba UNIÓN. Ah bueno. – outis

13

Puede usar Table Value Constructors para esto si lo admite su RDBMS. He aquí un ejemplo de Mr Celko

SELECT X.* 
FROM (VALUES (1, 3.07766, 6.31371, 12.7062, 63.65600), 
       (2, 1.88562, 2.91999, 4.30265, 9.92482), 
       (3, 1.63774, 2.35336, 3.18243, 5.84089)) AS X (A, B, C, D, E); 
1

T-SQL de UNPIVOT puede transponer los datos de las filas de columnas. Múltiples unpivots es equivalente al producto cartesiano de cada columna no divisada.

SELECT N, S 
    FROM (SELECT 1 aa, 2 ab, 3 ac, 'a' ba, 'b' bb, 'c' bc) s 
    UNPIVOT (N for Num in (aa,ab,ac)) AS t 
    UNPIVOT (S for Str in (ba,bb,bc)) AS u 

Resultado:

 
N | S 
--+-- 
1 | a 
1 | b 
1 | c 
2 | a 
2 | b 
2 | c 
3 | a 
3 | b 
3 | c 

Cuestiones relacionadas