2009-03-04 11 views
19

Jak mogę mieć pewność, że mój zestaw wyników będzie miał najpierw a i b? Pomoże mi rozwiązać trudny problem z zamawianiem.Jak mogę zamówić wpisy w UNION bez ORDER BY?

Oto uproszczony przykład tego, co robię:

SELECT a FROM A LIMIT 1 
UNION 
SELECT b FROM B LIMIT 1; 
+1

@tharkun: Rozumiem, że nie lubisz RichB, ale zdaj sobie sprawę z tego, jak wygląda twoje pytanie na stronie głównej, jeśli tylko dwie linie, które widzisz, to kod SQL, a nie pytanie. Właśnie dlatego zredagował to tak, jak zrobił, i, szczerze mówiąc, jego edycja sprawiła, że ​​pytanie wyglądało znacznie lepiej. –

+0

@tharkun: oddziel swój "surowy" ton od jego edycji. Są oddzielne. Z pewnością jest surowy w swoim języku; ale to nie sprawia, że ​​jego edycje są mniej ważne. –

+0

Przywrócono zmiany Rich. Nie popierać nikogo ani nic poza jakością pytania. –

Odpowiedz

34
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 
+0

, która wydaje się być wersją Pro + tego, co sugeruje Dana, dzięki! – markus

+0

jest to, że jeśli nie chcę porządkowe w zestawie wyników, prawda ?! – markus

+0

i jakie jest samotne "t" w linii 7? – markus

1

wiem dla Oracle nie ma sposobu, aby zagwarantować, który ukaże się pierwszy bez zlecenia przez. Problem polega na tym, że jeśli spróbujesz, może wyjść w poprawnej kolejności nawet przez większość czasu, kiedy go uruchomisz. Ale gdy tylko polegasz na tym w produkcji, wyjdzie to źle.

2

Nie, kolejność wyników w zapytaniu SQL jest kontrolowana tylko według klauzuli ORDER BY. Możliwe, że w niektórych sytuacjach możesz zobaczyć uporządkowane wyniki bez klauzuli ORDER BY, ale jest to przypadkiem (np. Efektem ubocznym obecnego planu kwerendy optymalizatora) i nie jest gwarantowane.

Jaki jest trudny problem z zamawianiem?

+0

dziękuję, myślałem, że tak ... trudny problem zamawiania, jeśli pozostanie podstępem będzie treść innego pytania, które chciałbym tu zamieścić . – markus

20

Nie sądzę, że zamówienie jest gwarantowane, przynajmniej nie we wszystkich DBMS.

Co robiłem w przeszłości, aby kontrolować kolejność w związkach jest:

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

oh, to genialne, łatwe i genialne! – markus

+0

Czy jesteś pewien, że zamówienie nie zostanie zastosowane tylko do ostatniego zapytania w związku? –

+0

@Kjetil: rzeczywiście masz rację, muszą być nawiasy – markus

0

bym nie pomyślał, ponieważ baza danych najprawdopodobniej trzeba zrobić ORDER BY w celu UNION .

UNION ALL może zachowywać się inaczej, ale YMMV.

+0

UNION ALL po prostu gwarantuje, że wszystkie rekordy są zwracane. Prosta kopia filtrów UNION. – Dana

-6

Krótka odpowiedź brzmi tak, dostaniesz wtedy B.

+0

i jaka jest długa odpowiedź, biorąc pod uwagę, że wszyscy inaczej mówi przeciwnie? – markus

+0

Długą odpowiedzią byłoby, że bez klauzuli ORDER BY, otrzymasz FIFO na podstawie klauzuli UNION. Na przykład, tabela B podana jako pierwsza w UNIONIE będzie oznaczać, B-> A. UNION nie wiąże się z żadnymi zachowaniami sortującymi. – Bill

+0

ppl nie wydają się z tobą zgadzać, czy możesz udowodnić swoje roszczenie? – markus

4

Twój zestaw wyników z UNION wyeliminuje różne wartości.

nie mogę znaleźć żadnego dowodu w dokumentacji, ale z 10 lat doświadczenia mogę powiedzieć, że UNION ALL robi zachować porządek, przynajmniej w Oracle.

Nie licz na to, jeśli budujesz elektrownię jądrową lub coś podobnego.

+3

Tak, buduję elektrownię jądrową! ;) – markus

+0

To wydaje się działać. Ma sens, że związek zepsuje zamawiania, jeśli sprawdza duplikaty, a związek nie – David