46 Stimmen

Row_Number() mit Union-Abfrage

Ich habe eine Sql-Abfrage, die Zeilen aus zwei Tabellen mit gleichen Spaltennamen zurückgibt. Ich benötige eine Zeilennummer für alle Datensätze in einer vollständigen Ergebnismenge.

Die Abfrage lautet wie folgt

select Id, VersionNumber from documents where id=5 
Union all  
select Id, VersionNumber from versions where id=5
order by VersionNumber desc

Wie sollte es gemacht werden?

EDIT: Und was, wenn ich nur eine row_num zurückgeben müssen, wo VersionNumber lässt sagen 5 ist.

75voto

Chandu Punkte 79046

Versuchen Sie dies:

SELECT *, ROW_NUMBER() OVER(ORDER BY Id) ROW_NUM
  FROM (
        select Id, VersionNumber from documents where id=5 
        Union all  
        select Id, VersionNumber from versions where id=5
       ) a
order by VersionNumber desc

Zum Filtern nach Versionsnummer 5 verwenden Sie:

SELECT * 
FROM   (SELECT *, 
               Row_number() OVER(ORDER BY versionnumber DESC, id) row_num 
        FROM   (SELECT id, 
                       versionnumber 
                FROM   documents 
                WHERE  id = 5 
                UNION ALL 
                SELECT id, 
                       versionnumber 
                FROM   versions 
                WHERE  id = 5) a) b 
WHERE  version = 5

1voto

Matt Punkte 175

Ein etwas besserer Weg wäre :-

with resultset1 as(
   select Id, VersionNumber from documents where id=5 
   Union all  
   select Id, VersionNumber from versions where id=5
), resultset2 as(
   select Id, VersionNumber, ROW_NUMBER() OVER(ORDER BY Id) ROW_NUM
   from resultset1
)
select * from resultset2 WHERE VersionNumber = 5

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X