2012-03-27 2 views
0

gegeben eine Tabelle mit zwei Spalten (1 - Art der Zeichenfolge, andere - Art der Nummer) gewährt. Ich brauche eine Abfrage (mit den Befehlen: join und rownum), in der jeder Reihe eine Anzahl von Zeiten in der zweiten Spalte zugewiesen wurde. zum Beispiel:Abfrage, jede Zeile wurde mehrmals in der zweiten Spalte (sql, oracle)

col1 col2 
---- ---- 
apple 4 
melon 1 
banana 2 

Ergebnis:

apple 
apple 
apple 
apple 
melon 
banana 
banana 
+5

oh lieber Gott. was haben sie jetzt gemacht – bernie

+1

Was SQL-Engine ist das? MySQL? SQL Server? Orakel? DB2? – mellamokb

+3

Eine "Ungroup by" -Funktion ... – Glenn

Antwort

1

SQL Server Angenommen, dies ist möglich, durch gezielten Einsatz einer tally Tabelle (sys.all_columns in diesem Beispiel verwendet wird, von dem die Größe auf die Obergrenze die Anzahl der Zeilen, die) und Berechnen von Teilsummen für die Indexnummer erzeugt werden kann, reicht, etwa so:

;with Ranges as (
    select 
     col1, 
     (select coalesce(sum(t2.col2), 0)+1 
      from MyTable t2 where t2.col1<t1.col1) as indexStart, 
     (select coalesce(sum(t2.col2), 0) 
      from MyTable t2 where t2.col1<=t1.col1) as indexEnd 
    from 
     MyTable t1 
) 
,TallyTable as (
    select 
     row_number() over (order by c.object_id, c.column_id) as number 
    from 
     sys.all_columns c 
) 
select 
    r.col1 
from 
    Ranges R, TallyTable T 
where 
    T.number between r.indexStart and r.indexEnd 

Obwohl, wie angegeben Durch die Kommentare zum OP wird dies nicht empfohlen, und es ist durchaus möglich, dass es eine bessere Lösung für Ihr Geschäftsproblem gibt.

+0

Schön. Wie ich von einem anderen Thread erfahren habe, hat Postgresql eine eingebaute "generate_series" -Funktion, die der TallyTable-Ersatz in der Postgresql-Version sein könnte. – Glenn

+0

danke Mellamokb für die Antwort :) aber können Sie diese Abfrage mit Befehlen (Join, Rownum) schreiben? Danke im Voraus! – Kopro

0

Sie verwenden SQL Server Angenommen, eine rekursive CTE mit wäre schön die Arbeit machen

  • von YourTable jede Zeile auswählen, um einen Zähler zu der Ergebnismenge hinzugefügt wird.
  • Recurse auf bestimmten Spalten, bis der Zähler den Wert in col2

SQL-Anweisung

;WITH q AS (
    SELECT col1, cnt = 1 
    FROM YourTable 
    UNION ALL 
    SELECT q.col1, cnt + 1 
    FROM q 
      INNER JOIN YourTable yt ON yt.col1 = q.col1 
    WHERE cnt < yt.col2   
) 
SELECT col1 
FROM q 
OPTION (MAXRECURSION 0) 

Testskript

;WITH YourTable(col1, col2) AS (
    SELECT 'apple', 4 
    UNION ALL SELECT 'melon', 1 
    UNION ALL SELECT 'banana', 2 
) 
, q AS (
    SELECT col1, cnt = 1 
    FROM YourTable 
    UNION ALL 
    SELECT q.col1, cnt + 1 
    FROM q 
      INNER JOIN YourTable yt ON yt.col1 = q.col1 
    WHERE cnt < yt.col2   
) 
SELECT col1 
FROM q 
OPTION (MAXRECURSION 0) 
+2

Ich kann mich nicht daran gewöhnen, dass SQL Server ein Anweisungsbeendigungszeichen vor einer Anweisung benötigt ... –

0

Wie Sie gegeben haben, nicht ein DBMS erreicht Ich nehme PostgreSQL an:

with test_data (col1, col2) as (
    values ('apple', 4), ('melon', 1), ('banana', 2) 
) 
select col1 
from (
    select col1, generate_series(1, col2) 
    from test_data 
) t 
Verwandte Themen