2010-05-22 9 views
6

SELECT bez FROM klauzuli dostaje nam wiele kolumn bez odpytywanie tabeli:Czy można wybrać tableless z wieloma wierszami?

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

Jak możemy napisać kwerendę, która prowadzi do wielu wierszy bez odwoływania się do tabeli? Zasadniczo, nadużyć SELECT, aby włączyć go do definicji definicji danych. Wynik może mieć jedną kolumnę lub wiele kolumn.

Jestem najbardziej zainteresowany neutralną odpowiedzią DBMS, ale inne (na przykład oparte na UNPIVOT) są mile widziane. Chciałbym zebrać jak najwięcej sposobów na to, jak to możliwe. Za tym pytaniem nie ma zastosowania techniki; to bardziej teoretyczne niż praktyczne.

Odpowiedz

12

Użyj UNION:

SELECT 1 
UNION 
SELECT 2 

Wygląda to w MySQL:

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

Zastosowanie UNION ALL aby uniknąć utraty nieunikalne rzędach.

+0

Miałem nadzieję dostać kilka out-tam odpowiedzi, zanim ktoś rzucił bombę Unii. Ach tak. – outis

13

Możesz użyć do tego Table Value Constructors, jeśli jest obsługiwany przez Twój RDBMS. Oto przykład z 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 na UNPIVOT może przenieść dane z wierszy do kolumn. Wiele unpivotów jest równoważne iloczynowi kartezjańskiemu każdej niepodzielonej kolumny.

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 

Wynik:

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

Powiązane problemy