2010-05-22 3 views
6

Une SELECT sans clause FROM nous obtient un plusieurs colonnes sans Interroger une table:Est-il possible d'avoir un select sans table avec plusieurs lignes?

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

Comment peut-on écrire une requête qui entraîne plusieurs lignes sans se référer à une table? Fondamentalement, abusez SELECT pour le transformer en une déclaration de définition de données. Le résultat pourrait avoir une seule colonne ou plusieurs colonnes.

Je suis particulièrement intéressé par une réponse neutre au SGBD, mais d'autres (par exemple basées sur UNPIVOT) sont les bienvenues. J'aimerais recueillir autant de façons de le faire que possible. Il n'y a pas d'application technique derrière cette question; c'est plus théorique que pratique.

Répondre

12

Utilisez un UNION:

SELECT 1 
UNION 
SELECT 2 

se présente comme suit dans MySQL:

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

Utilisez UNION ALL pour éviter la perte de lignes non uniques.

+0

je l'avais espéré obtenir un peu plus hors-il des réponses avant que quelqu'un a largué la bombe UNION. Et bien. – outis

13

Vous pouvez utiliser Table Value Constructors pour cela si pris en charge par votre SGBDR. Voici un exemple 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 peut transposer des données de lignes à colonnes. Plusieurs points de pivot sont équivalents au produit cartésien de chaque colonne non pivotée.

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 

Résultat:

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

Questions connexes