2016-05-06 15 views
0

Ich habe eine Datenbanktabelle test.The Struktur der Tabelle ist:SQL-Abfrage ohne Schleifen mit

Col1(varchar) Col2(number) 

Die Tabelle hat zwei Reihen:

Abc 5 
Def 6 

ich die Ausgabe sein wollen:

Ich brauche eine einzige Abfrage ohne Verwendung von PLSQL-Schleifen, um diese Ausgabe zu erreichen. Bitte helfen.

+0

kann man einfach nicht verwenden SELECT col1, ABC, ABC, ABC, ABC, ABC, def, def, def, def, def'? – Breeze

+0

Ist es richtig, dass Sie 'plsql' nicht verwenden möchten, weil die Abfrage mit mehr als nur Postgresql/Oracle arbeiten soll? –

+0

Welches RDBMS? Bitte markieren Sie entsprechend. (Dies kann mit einigen Variationen einer 'nums' Tabelle gemacht werden, aber auch das variiert systemübergreifend.) –

Antwort

0

Oracle-Setup:

CREATE TABLE table_name (col1, col2) AS 
SELECT 'ABC', 5 FROM DUAL UNION ALL 
SELECT 'DEF', 6 FROM DUAL UNION ALL 
SELECT 'GHI', 0 FROM DUAL; 

Abfrage - Mit einer Sammlung:

SELECT t.Col1 
FROM table_name t, 
     TABLE(
     CAST(
      MULTISET(
      SELECT 1 
      FROM DUAL 
      WHERE t.Col2 > 0 
      CONNECT BY LEVEL <= t.Col2 
      ) 
      AS SYS.ODCINUMBERLIST 
     ) 
     ); 

Abfrage - Mit Hilfe eines rekursiven Unterabfrage factoring Klausel:

WITH sqfc (COL1, COL2) AS (
    SELECT col1, col2 FROM table_name 
    UNION ALL 
    SELECT col1, col2 - 1 FROM sqfc WHERE col2 > 1 
) 
SELECT col1 
FROM sqfc 
WHERE col2 > 0 -- Needed if col2 is zero 
ORDER BY Col1; 

Ausgang (aus beiden Abfragen):

COL1 
---- 
ABC 
ABC 
ABC 
ABC 
ABC 
DEF 
DEF 
DEF 
DEF 
DEF 
DEF 
3

Hier ist eine Möglichkeit, es zu tun:

select  col1 
from  mytable, 
      (select  rownum r 
      from  dual 
      connect by rownum <= (select max(col2) from mytable)) 
where  r <= col2 
Verwandte Themen