2016-06-08 13 views
1

Ich habe die folgenden sql, die nicht mit sql-server funktioniert, weil order von nur in einem subselect erlaubt ist, wenn ich schlüsselwörter wie top verwende.sql-server und oracle - order von in subselect

SELECT DISTINCT * 
    FROM (SELECT pnr, naname, vorname, gebdat, '' p_alter, geschl, gebort 
     FROM pgrdat 
     WHERE man = 'XYZ' 
     ORDER BY pst_ab DESC) 

Gibt es eine Möglichkeit, die gewünschten Ergebnisse zu erhalten? Der SQL sollte auch unter Oracle funktionieren.

Ich möchte auf alle Felder ohne "pst_ab" unterscheiden, aber gleichzeitig möchte ich es mit "pst_ab" bestellen.

Eine Abhilfe wäre, dass ich die Reihenfolge aus dem Subselect und dem Quellcode verwende, stelle sicher, dass ich alle pnr-Nummern nur einmal bekomme.

Vielen Dank.

Antwort

1

Tabellen in einer relationalen Datenbank sind von Natur aus unsortiert, und so alles, was in einer from-Klausel verwendet wird, wird als unsortiert betrachtet.
Das ist der Grund, warum SQL Server Ihnen nicht erlaubt, eine order by-Klausel in einer abgeleiteten Tabelle zu verwenden, es sei denn, Sie verwenden auch das Schlüsselwort top.

Jetzt verstehe ich Ihre missliche Lage ist dies: Auf der einen Seite wollen Sie unterschiedliche Werte, die die pst_ab Spalte nicht enthält, aber auf der anderen Seite möchten Sie die Werte von der gleichen Spalte sortiert werden.

Glücklicherweise können Sie die ROW_NUMBER() Fensterfunktion für diesen Einsatz:

SELECT pnr, 
     naname, 
     vorname, 
     gebdat, 
     p_alter, 
     geschl, 
     gebort 
FROM (
    SELECT pnr, 
      naname, 
      vorname, 
      gebdat, 
      '' p_alter, 
      geschl, 
      gebort, 
      ROW_NUMBER() OVER(PARTITION BY pnr, 
              naname, 
              vorname, 
              gebdat, 
              geschl, 
              gebort 
           ORDER BY pst_ab DESC) RowNumber 
    FROM pgrdat 
    WHERE man = 'XYZ' 
) d 
WHERE RowNumber = 1 

Die ROW_NUMBER wird die Ergebnisse von pst_ab und die WHERE Klausel in der äußeren Abfrage sortieren liefert die DISTINCT Funktionalität.

Getestet auf Sql-Server, ich denke, es sollte das gleiche auf Orakel funktionieren, aber ich habe keine Möglichkeit, das zu testen.

+0

ich werde das versuchen, vielen dank - meine beschreibung sollte nächstes mal besser sein –

+0

ich habe es auf oracle mit einem anderen beispiel versucht, es klappt auch dort - morgen kann ich das finale ergebnis auf dem produktiven system testen, danke. –

+0

Gut zu helfen :-) –

0

Versuchen Sie, Ihre eigene und Reihenfolge zu wechseln;

SELECT * 
FROM (
    SELECT DISTINCT 
     pnr 
     ,naname 
     ,vorname 
     ,gebdat 
     ,'' p_alter 
     ,geschl 
     ,gebort 
     ,pst_ab 
    FROM pgrdat 
    WHERE man = 'XYZ' 
    ) 
ORDER BY pst_ab DESC 

Auf diese Weise erhalten Sie immer noch die eindeutige Liste und es ist korrekt bestellt. Natürlich müssen Sie das Feld pst_ab in Ihre innere Auswahl aufnehmen. Wenn Sie dies nicht in den Ergebnissen möchten, versuchen Sie dies;

SELECT DISTINCT 
pnr 
,naname 
,vorname 
,gebdat 
,p_alter 
,geschl 
,gebort 
FROM (
    SELECT DISTINCT 
     pnr 
     ,naname 
     ,vorname 
     ,gebdat 
     ,'' p_alter 
     ,geschl 
     ,gebort 
     ,pst_ab 
    FROM pgrdat 
    WHERE man = 'XYZ' 
    ) 
ORDER BY pst_ab DESC 
0

Sie benötigen ORDER BY aus subselect ziehen.

SELECT DISTINCT * 
    FROM (SELECT pnr, naname, vorname, gebdat, '' p_alter, geschl, gebort, pst_ab 
     FROM pgrdat 
     WHERE man = 'XYZ') 
ORDER BY pst_ab DESC 
+0

Mit dieser Methode würde ich jede mögliche Kombination aus allen Feldern erhalten, die von pst_ab bestellt wurden. Das ist nicht was ich will. Ohne das "pst_ab" -Feld im Subselect auszuwählen, würde ich nur die "aktuelle" oder? –

+0

Sie können eine weitere Spalte vor * pst_ab * hinzufügen, wenn Sie mehr als eine Unterabfrage zu bestellen haben. –