2012-04-02 15 views
1

Dies ist ein einfaches, aber ich kann es wirklich nicht herausfinden.Oracle SQL - Zählen bis 3

Ich versuche, diese einfache Tabelle zu erhalten:

NUMBER 
1 
2 
3 

Also versuche ich dies:

select (1,2,3) as number from dual; 

und ich

ORA-00907: fehlende rechte Klammer 00907. 00000 - "fehlende rechte Klammer"

Wie kann ich dieses statische t erstellen? fähig?

EDIT: Sorry, ich habe meine Tabelle vereinfacht, sollte aber expliziter sein. Meine Zahlen sind nicht 1, 2 und 3, sie sind etwa 50 Nummern irgendwo zwischen 1 und 10.000. Klingt so, kann nicht getan werden?

+0

Definieren Sie "irgendwo". Versuchen Sie, Zufallszahlen im angegebenen Bereich zu generieren? –

+0

@BrankoDimitrijevic Nein, tut mir leid. Ich habe diese statische Liste von Zahlen. – Jeremy

Antwort

3

Dieser "Trick" wird es tun:

select n 
from (select rownum n from dual 
     connect by level <= 3); 
1

Von Oracle 10g weiter, können Sie tun:

SELECT LEVEL "NUMBER" 
FROM DUAL 
CONNECT BY LEVEL <= 3 

Offensichtlich kann diese leicht mehr Zahlen modifiziert werden als 3 nur zu erzeugen, wenn erforderlich.

--- EDIT ---

Für eine statische Liste von Zahlen, können Sie einfach:

SELECT 1 FROM DUAL 
UNION ALL 
SELECT 2 FROM DUAL 
UNION ALL 
SELECT 3 FROM DUAL 
-- etc... 

Oder im Fall müssen Sie es verwenden, um von mehr als einem Ort, stellt die Daten in einer temporären Tabelle:

CREATE GLOBAL TEMPORARY TABLE TMP_TABLE (
    "NUMBER" INT PRIMARY KEY 
); 

INSERT INTO TMP_TABLE VALUES (1); 
INSERT INTO TMP_TABLE VALUES (2); 
INSERT INTO TMP_TABLE VALUES (3); 

SELECT * FROM TMP_TABLE; 
+0

Tatsächlich glaube ich, dass dies seit Oracle 2 verfügbar ist. –

+0

@MarkBannister Ich denke, die Syntax aus der Antwort von Tony Andrews war vor Oracle 10g verfügbar (obwohl Oracle 2, ein Produkt aus dem Jahr 1979, scheint ein bisschen zu viel eine Strecke;)), aber nach [dieser Seite] (http: //www.orafaq.com/wiki/Oracle_Row_Generator_Techniques#CONNECT_BY_LEVEL) Die Syntax aus meiner Antwort war von Oracle 10g verfügbar. OTOH, ich bin sicher kein Oracle-Geschichtsexperte, also könnte ich mich irren ... –

+0

Ich weiß nicht, warum der orafaq.com-Artikel sagt, dass die Syntax in Ihrer ersten Abfrage nur ab 10g verfügbar ist, es sei denn, LEVEL war nur verfügbar in CONNECT BY-Klauseln (nicht SELECT-Klauseln) vor 10g - Ich habe keine ältere Version von Oracle zur Hand. Wie ich es verstehe, war DUAL von Oracle 1 verfügbar, während die CONNECT BY-Syntax in Oracle 2 eingeführt wurde. –

0

ich bin nicht sicher, was Sie unter „Wie kann ich diese statische Tabelle erstellen?“ Wenn ich von statischen Tabellen denke, denke ich an so etwas wie:

SQL> create table t (n number); 

Table created. 

SQL> insert into t values (1); 

1 row created. 

SQL> insert into t values (5000); 

1 row created. 

SQL> -- .... 
SQL> insert into t values (10000); 

1 row created. 

SQL> commit; 

Commit complete. 

SQL> select * from t; 

     N 
---------- 
     1 
     5000 
    10000 

dual zu benutzen:

SQL> select * 
    2 from (select 1 as n from dual 
    3  union all select 5000 from dual 
    4  -- ... 
    5  union all select 10000 from dual); 

     N 
---------- 
     1 
     5000 
    10000 

Bitte nicht number die Spalte benenne. Nichts Gutes kann von der Verwendung eines reservierten Wortes als Spaltenname herrühren.