2010-05-22 2 views
6

A SELECT ohne FROM Klausel wird uns ein mehrere Spalten ohne eine Tabelle abfragt:Ist es möglich, eine tabellenlose Auswahl mit mehreren Zeilen zu treffen?

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

Wie können wir eine Abfrage schreiben, die ohne Bezugnahme auf eine Tabelle in mehreren Zeilen führt? Im Grunde missbrauchen Sie SELECT, um es in eine Datendefinitionsanweisung umzuwandeln. Das Ergebnis könnte eine einzelne Spalte oder mehrere Spalten haben.

Ich interessiere mich am meisten für eine DBMS neutrale Antwort, aber andere (z. B. basierend auf UNPIVOT) sind willkommen. Ich möchte so viele Möglichkeiten wie möglich sammeln. Es gibt keine Technikanwendung hinter dieser Frage; es ist mehr theoretisch als praktisch.

Antwort

12

Verwenden Sie ein UNION:

SELECT 1 
UNION 
SELECT 2 

wie dies in MySQL Aussehen:

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

Verwenden UNION ALL den Verlust von nicht-eindeutigen Zeilen zu vermeiden.

+0

Ich hatte gehofft, etwas mehr raus-dort beantwortet, bevor jemand die UNION Bombe abgeworfen. Ah, gut. – outis

13

Sie können Table Value Constructors dafür verwenden, wenn dies von Ihrem RDBMS unterstützt wird. Hier ist ein Beispiel von 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 der UNPIVOT Daten aus Zeilen in Spalten transponieren können. Mehrere Unpivots entsprechen dem kartesischen Produkt jeder nicht gespaltenen Spalte.

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 

Ergebnis:

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

Verwandte Themen