Grzegorz Milczewski

Grzegorz Milczewski Kierownik biura
portowego.

Temat: Przeskakujące rekordy

Witam Wszystkich,

Ostatnio mam problem z przeskakiwaniem rekordów przy wywołaniu SELECT..
Chodzi o sytuację, że przy tym samym zapytaniu każdorazowo rekordy wyświetlają się w innej kolejności.

np.:

Wywołuje SELECT:

rekordy w kolejności:
1
2
3

Znowu wywołuje ten sam SELECT
rekordy w kolejności :

3
1
2

Itd...

Czego nie mam, że tak wariują ?
Tomasz Serwański

Tomasz Serwański Microsoft Dynamics
CRM - konsultant
biznesowy

Temat: Przeskakujące rekordy

Grzegorz M.:
Czego nie mam, że tak wariują ?
order by
Grzegorz Milczewski

Grzegorz Milczewski Kierownik biura
portowego.

Temat: Przeskakujące rekordy

"order by" próbowałem, daje podobne rezultaty jak opisałem wcześniej :(

konto usunięte

Temat: Przeskakujące rekordy

Podaj zapytanie
Grzegorz Milczewski

Grzegorz Milczewski Kierownik biura
portowego.

Temat: Przeskakujące rekordy

SELECT ...

FROM dbo.zlecenia INNER JOIN
dbo.obrot ON dbo.zlecenia.zlecenie = dbo.obrot.zlecenie INNER JOIN
dbo.transport ON dbo.zlecenia.zlecenie = dbo.transport.zlecenie
WHERE (dbo.zlecenia.datapod >= 20130729) AND (dbo.zlecenia.miejscowosc = 'WARSZAWA (doc)')
ORDER BY dbo.zlecenia.relacja

Nic skomplikowanego.
Zwróciłem uwagę, że w przypadku różnych danych w poszczególnych rekordach (polach) w stosunku do innych sytuacja się stabilizuje.
Jeśli dane w którejkolwiek kolumnie są identycznie zaczyna się "taniec".
Tomasz Serwański

Tomasz Serwański Microsoft Dynamics
CRM - konsultant
biznesowy

Temat: Przeskakujące rekordy

a zlecenie.relacja masz w select? i sprobuj zrobic order by datapod albo miejscowosc zeby sie upewnic ze po innych polach sortuje
Grzegorz Milczewski

Grzegorz Milczewski Kierownik biura
portowego.

Temat: Przeskakujące rekordy

zlecenie.relacja jest w SELECT. Wstawienie datapod stabilizuje rekordy w tym zapytaniu.
Jednak są one (zapytanie) generowane dynamicznie i z tego co widzę w ORDER BY musiały by być wstawiene pola biorące udział w grupie WHERE.

Hmm ...
Wojciech M.

Wojciech M. Senior Software
Engineer | Data
Science Team at
Analyx®

Temat: Przeskakujące rekordy

Jeżeli nazwy tabel nie są generowane dynamicznie, a zależy nam właśnie na stabilizacji sortowania rekordów, w klauzuli ORDER BY można umieścić na stałe kilka pól, które pozwolą każdorazowo na jednoznaczne sortowanie. Jeśli nazwy tabel są także generowane dynamicznie, zadziała to tylko jeżeli nazwy kolumn będą identyczne, inaczej pozostanie tylko dynamiczne generowanie pól także w klauzuli ORDER BY. W zależności od listy pól w instrukcji SELECT i sposobu w jaki są generowane można też pomyśleć o umieszczeniu numerów porządkowych pól zamiast nazw kolumn.Ten post został edytowany przez Autora dnia 29.07.13 o godzinie 20:28

Temat: Przeskakujące rekordy

Zlecenie.relacja są unikalne? Na duplikatach w tym polu przecież może zmieniać kolejność rekordów.
Grzegorz Milczewski

Grzegorz Milczewski Kierownik biura
portowego.

Temat: Przeskakujące rekordy

Tabele są stałe . Jedynie zapytania są generowane dynamicznie.
Niestety nazwy pól nie mogą być zastąpione numerami, ze względu na sposób administrowania nimi w nakładce programowej (za duży nakład pracy :) )

Unikalnym polem jest tylko pole zlecenia.zlecenie. W pozostałych polach bardzo często dane się powtarzają.

Temat: Przeskakujące rekordy

jeśli zaburzenia kolejności występują w zakresie tych samych wartości pola zlecenia.relacja, a zlecenia.zlecenie jest unikalne może odpowiednim sortowaniem będzie order by zlecenia.relacja,zlecenia.zlecenie
Grzegorz Milczewski

Grzegorz Milczewski Kierownik biura
portowego.

Temat: Przeskakujące rekordy

Ustawienie sortowania na zlecenia.zlecenie stabilizuje. Jednak pokuszę się o dynamiczne ustawianie grupy
ORDER BY zgodnie z grupą WHERE.
Przekaże moje wnioski.

konto usunięte

Temat: Przeskakujące rekordy

W SQLServer nie masz gwarancji kolejności rekordów. To jest działanie zgodne z założeniami.
Jedynym sposobem otrzymania (gwarantowanej) tej samej kolejności rekordów jest użycie klauzuli ORDER BY...

Pozostaje kwestia tego, żeby w klauzuli sortującej były zawarte kolumny, które są w stanie zagwarantować unikalność rekordów... jeśli np. tabelę klientów posortujemy tylko po mieście to tylko miasta będą posortowane ale pozostałe rekordy w ramach danego miasta mogą zmieniać kolejność przy kolejnych wykonaniach SELECT.
Grzegorz Milczewski

Grzegorz Milczewski Kierownik biura
portowego.

Temat: Przeskakujące rekordy

Mam problem, w związku iż zapytania są generowane dynamicznie, rowniez przchowywane w trakcie, dodanie na koncu zapytania polecenia 'ORDER BY' nie daje oczekiwanych wyników ;)

Generują się takie cuda :

....
AND (zlecenie = 234)
ORDER BY zlecenie
AND (miejsce='waw')

Musiał bym się mocno sprężyć aby wszystko przypilnować ...

Lipa.

konto usunięte

Temat: Przeskakujące rekordy

Roman C.:
W SQLServer nie masz gwarancji kolejności rekordów.

To samo dotyczy, najprawdopodobniej, także innych baz danych. Paradygmat RDBMS nie określa czegoś takiego jak "kolejność wierszy"

konto usunięte

Temat: Przeskakujące rekordy

Możesz spróbować zrobić procedurę składowaną, która będzie przyjmowała tekst polecenia SQLowego do wykonania, dodawała na końcu np. order by 1,2,3 i wykonywała całość...
... tylko te kolumny po których chcesz sortować trzeba by było zawsze na początku mieć

Temat: Przeskakujące rekordy

Jeżeli zależy Ci tylko na stałej kolejności wyników a nie konkretnym sortowaniu to użyj kluczy głównych w ORDER BY które są zawsze unikalne.
Rafał C.

Rafał C. Projektant,
Programista .NET
Devexpress, MS SQL
Database ...

Temat: Przeskakujące rekordy

Michał S.:
Jeżeli zależy Ci tylko na stałej kolejności wyników a nie konkretnym sortowaniu to użyj kluczy głównych w ORDER BY które są zawsze unikalne.

To nic nie da.
Nie myl klucza głównego z indeksem klastrowym.
Wynik może być w różnej kolejności w zależności od użycia różnych indeksów nieklastrowanych.

Tak jak mówi Roman - gwarancję masz tylko wtedy gdy jawnie użyjesz klauzuli ORDER BY.



Wyślij zaproszenie do