2016-12-21 13 views
4

Warum & & Operator von PostgreSQL 9.4 Verwendung zum Überprüfen der Überlappung von zwei Array, ändern Sie die Reihenfolge des Ergebnisses?&& Operator die Reihenfolge des Ergebnisses ändern

Ich habe eine Abfrage

Select * FROM "View_Student_Plan" WHERE "ClassID" && ARRAY[53]:: bigint[] 

Meine Ansicht in der Reihenfolge des Aufnahmedatums sortiert ist. Es funktioniert gut, wenn ich

Select * FROM "View_Student_Plan" 

Aber wenn ich Teil mit Abfrage verbleibenden attach es um die Reihenfolge der Folge ändern.

Ich habe eine andere Bedingung in Where-Klausel wie Student_Name like 'P%', dann nicht beeinflussen Reihenfolge der Ergebnis von Select-Anweisung gegeben. Dann warum nicht für "ClassID" && ARRAY[53]:: bigint[]

+0

Wenn Sie eine bestimmte Reihenfolge Ihres Ergebnisses benötigen, sollten Sie Ihrer Abfrage eine ORDER BY-Klausel hinzufügen. Sie sollten nicht auf die Reihenfolge von Abfragen oder Sichten zählen, die keine explizite Reihenfolge haben. – clemens

+0

@macmoonshine Aber wenn ich Frage ausführen wähle * von "Ansicht ..." dann funktioniert es richtig. –

+1

@ Pooja-G kann es, oder morgen kann es nicht. Diese falsche Annahme ist so stark, dass sqlite sogar ein Pragma hat, um die Reihenfolge umzukehren, nur um diese Fehler wieder auftauchen zu lassen. Sie können sich nicht darauf verlassen, dass etwas bestellt wird, wenn die Spezifikation es nicht erlaubt. – keltar

Antwort

6

In jedem RDBMS ist die Reihenfolge der Ausgabe nicht standardmäßig festgelegt und kann jedes Mal anders sortiert werden! Es kann nach Indizes, Optimierer, Standardeinstellungen und ETC sortiert werden.

Die einzige Möglichkeit, eine bestimmte Bestellung zu erzwingen (z. B. nach Aufnahmedatum), ist die Verwendung der Klausel ORDER BY.

EDIT: In Bezug auf Ihren Kommentar, ein VIEW kann keine ORDER BY Klausel enthält, ist es nicht wirksam ist, wie diese Klausel der Abfrage am Ende sein soll, sonst kann es ignoriert werden.
E.G.

SELECT * FROM YourView 
ORDER BY....--THIS WILL WORK 

Wenn es in der Ansicht ist seine wie:

SELECT * 
FROM (SELECT * FROM .... 
     ORDER BY ..) 

So das Optimierungsprogramm ist frei, dies zu ignorieren.

+0

Ich benutze order by. "View_Student_Plan" ist meine Ansicht und die Abfrage dieser Ansicht enthält die Order by-Klausel. –

+1

@ Pooja-G Die 'Reihenfolge von' muss am Ende der Abfrage stehen, sonst wird sie ignoriert. – Magnus

+0

Aber wenn ich Abfrage ausführen wähle * aus "view ..." dann funktioniert es richtig. @ Magnus –

Verwandte Themen