Frage

Wie kann ich sicher sein, dass meine Ergebnismenge a ersten und zweite b haben wird? Es würde mir helfen, eine schwierige Ordnung Problem zu lösen.

Hier ist ein vereinfachtes Beispiel, was ich tue:

SELECT a FROM A LIMIT 1 
UNION 
SELECT b FROM B LIMIT 1;
War es hilfreich?

Lösung

SELECT col
FROM 
   (
       SELECT a col, 0 ordinal FROM A LIMIT 1
       UNION ALL
       SELECT b, 1 FROM B LIMIT 1
   ) t
ORDER BY ordinal

Andere Tipps

Ich glaube nicht, Ordnung gewährleistet ist, zumindest nicht in allen DBMS.

Was ich in der Vergangenheit getan, um die Ordnung in UNIONs zu kontrollieren ist:

(SELECT a, 0 AS Foo FROM A LIMIT 1)
UNION
(SELECT b, 1 AS Foo FROM B LIMIT 1)
ORDER BY Foo

Ihr Ergebnis mit UNION gesetzt werden unterschiedliche Werte eliminieren.

Ich kann keinen Beweis in der Dokumentation finden, aber von 10 Jahren Erfahrung kann ich das UNION ALL sagen, um nicht zu erhalten, zumindest in Oracle.

Sie sich darauf nicht verlassen, aber wenn Sie ein Atomkraftwerk oder so etwas wie das Gebäude sind.

Nein, ist die Reihenfolge der Ergebnisse in einer SQL-Abfrage gesteuert nur durch die ORDER BY-Klausel. Es kann sein, dass Sie ohne eine ORDER BY-Klausel in einiger Situation bestellt Ergebnisse sehen passieren, aber das ist zufällig (beispielsweise einen Nebeneffekt des aktuellen Abfrage-Plans des Optimierers) und nicht garantiert werden.

Was ist das schwierige Ordnung Problem?

Ich weiß, für Oracle gibt es keine Möglichkeit, die zuerst von ohne Auftrag kommt heraus zu gewährleisten ist. Das Problem ist, wenn Sie versuchen, es es sogar in der richtigen Reihenfolge herauskommen kann für die meisten der Zeit Sie es ausführen. Aber sobald Sie auf es in der Produktion verlassen, wird es kommen falsch heraus.

Ich habe nicht hätte gedacht, da die Datenbank würde höchstwahrscheinlich eine ORDER BY, um die UNION tun müssen.

UNION ALL könnte sich anders verhalten, aber YMMV.

Die kurze Antwort ist ja, Sie bekommen dann A B.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top