Kolejność zwracanych wyników - łączenie tabel

Kolejność zwracanych wyników - łączenie tabel
KO
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 463
0

Cześć,
Załóżmy, że mam jakieś zapytanie, które korzysta z JOIN-a typu: SELECT imie, nr_zamowienia FROM Klienci LEFT JOIN Zamowienia ON ...
Celowo nie korzystam z ORDER BY, więc zakładam, że zwracane wyniki mogą być losowe. Ale pytanie jak bardzo losowe...

Czy jest ryzyko, że SQL zwróci mi wyniki np. w taki sposób:
Stefan | 2
Stefan | 1
Alicja | 3
Stefan | 4

Czy jednak zawsze będę miał to pogrupowane po zewnętrznej tabeli tzn:
Stefan | 2
Stefan | 1
Stefan | 4
Alicja | 3

Chodzi mi o to, czy wyniki mogą być całkowicie losowe i wymieszane (pierwszy przykład) czy jednak mam pewność, że jak baza zacznie zwracać wyniki Stefana i zwróci N wyników a następnie zacznie zwracać wyniki Alicji to Stefan się już później nie pojawi (wszystkie elementy z dołączonej tabeli, a powiązane ze Stefanem, zostały zwrócone)?
Czy to definiuje jakiś standard?

TR
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 118
2
Kofcio napisał(a):

Cześć,
Załóżmy, że mam jakieś zapytanie, które korzysta z JOIN-a typu: SELECT imie, nr_zamowienia FROM Klienci LEFT JOIN Zamowienia ON ...
Celowo nie korzystam z ORDER BY, więc zakładam, że zwracane wyniki mogą być losowe. Ale pytanie jak bardzo losowe...

Czy jest ryzyko, że SQL zwróci mi wyniki np. w taki sposób:
Stefan | 2
Stefan | 1
Alicja | 3
Stefan | 4

Czy jednak zawsze będę miał to pogrupowane po zewnętrznej tabeli tzn:
Stefan | 2
Stefan | 1
Stefan | 4
Alicja | 3

Chodzi mi o to, czy wyniki mogą być całkowicie losowe i wymieszane (pierwszy przykład) czy jednak mam pewność, że jak baza zacznie zwracać wyniki Stefana i zwróci N wyników a następnie zacznie zwracać wyniki Alicji to Stefan się już później nie pojawi (wszystkie elementy z dołączonej tabeli, a powiązane ze Stefanem, zostały zwrócone)?
Czy to definiuje jakiś standard?

Tak dla precyzji - masz na myśli nie wyniki losowe, czy tylko losową kolejność wyników?
Jest jakiś powód dlaczego nie możesz skorzystać z ORDER BY - po to tak naprawdę jest ta klauzula.
Zakładając, że zależy Ci na kolejności, to jest najbezpieczniejsza droga, szczególnie jeśli w przyszłości zmodyfikujesz zapytanie a jakikolwiek sposób.

Mechanizm SQL na pewno sortuje wyniki tak samo, ale to przy zapytaniu TOP X z jednej tabeli (pod warunkiem, że nie zaszły żadne inne modyfikacje).

FA
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 215
2

Z moich obserwacji wynika, że w takim przypadku wyniki w MSSQL są podawane w kolejności występowania zapytań - tak, jakby serwer wykonywał poszczególne selekty jeden po drugim.

Ale!
Jeśli zamierzasz polegać na kolejności zwracanych danych, to dodaj ORDER BY i tyle. Standard SQL nie gwarantuje, że wyniki pierwszego selekta znajdą się przed wynikami drugiego. I nawet, jeśli obecna wersja Twojego silnika zawsze daje taki rezultat (bo ktoś tak to zaimplementował), to w kolejnej wersji może to zostać zmienione.

hzmzp
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 734
2

Wyniki są całkowicie losowe i nieprzewidywalne, ale zależne od wewnętrznych mechanizmów, takich jak ułożenie w pamięci (na dysku/ram), cache, włączone optymalizacje, indexy czy inne funkcje.
Ich losowość jest tak nie sprecyzowana, że na twoim kompie cały czas może zwracać porządek 1,2,3 a na komputerze kolegi już będzie 2,1,3, a czasami 3,2,1.

KO
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 463
0

Ok, dziękuję wszystkim za pomoc!

Zarejestruj się i dołącz do największej społeczności programistów w Polsce.

Otrzymaj wsparcie, dziel się wiedzą i rozwijaj swoje umiejętności z najlepszymi.