2016-04-13 16 views
0

Hier zwei Abfrage auf den ersten Blick gleich:MySQL Vereinigung ist nicht deterministisch

SELECT obj_id 
FROM obj t JOIN joined_a a ON t.`id` = a.`obj_id` 
UNION 
SELECT obj_id 
FROM obj t JOIN joined_b b ON t.`id` = b.`obj_id`; 

und

SELECT obj_id 
FROM obj t JOIN joined_b b ON t.`id` = b.`obj_id` 
UNION 
SELECT obj_id 
FROM obj t JOIN joined_a a ON t.`id` = a.`obj_id`; 

Sie unterscheiden sich nur mit ausgewählten der Sequenz.

Ergebnis Zeilen Menge aus diesen beiden Abfragen sind unterschiedlich!

Wie ist das möglich?

Wenn ich DISTINCT zu jeder SELECT ... Zeilen Menge hinzufügen, wird der Wert NEW, der größte Wert!

Wenn ich Klammern jedes Add SELECT wie

(select ...) 
UNION 
(select ...) 

Reihen Menge wird der Wert des DISTINCT haben.

+0

könnten Sie bitte posten Sie Ihre Anfragen genau so, wie sie sind, und einige Beispieldaten (genug, um zu reproduzieren) – Quassnoi

+0

Ich denke, es ist deterministisch ist - bei Wenn "obj_id" in beiden Tabellen genau den gleichen Typ hat, stimmt etwas mit dem Test nicht überein. Möglicherweise hängen die Typen von der Reihenfolge der Anweisungen ab, aber die MySQL-Dokumentation behauptet, dass alle Unterabfragen verwendet werden, um die Ausgabetypen zu bestimmen. Sie erkennen, dass es keine Garantie für die Reihenfolge der Ergebnisse gibt, es sei denn, Sie verwenden 'order by'. –

Antwort

1

Diese beiden Abfragen geben die gleichen Zeilen zurück, jedoch nicht unbedingt in derselben Reihenfolge.

UNION dedupliziert die Ergebnisse für Sie, so dass die DISTINCTs nichts tun und die Größe der Ergebnismenge unabhängig von der SELECT-Reihenfolge gleich ist.

Die einzige Erklärung, die zu Ihrem Test passt, ist, dass zwischen den beiden Daten mehr Daten eingefügt wurden.

0

Sie haben Recht!

Ich kam in eine heimtückische Falle mit SQLYog ultimative GUI-Schnittstelle v11.11 BUG-feacher !!!

GUI fügt jeder Abfrage LIMIT 0, 1000 hinzu; . Suffix :(

Check-Abfragen auf der Kommandozeile und es ist gut funktionieren

+0

Ja, das würde es tun ... denke, es gab schließlich eine andere Erklärung! – Arth