Post
#1
|
|
|
Grupa: Zarejestrowani Postów: 14 Pomógł: 0 Dołączył: 4.09.2013 Ostrzeżenie: (0%)
|
Witam,
Mam problem w odpytaniu Bazy danych w sposób „elegancki”, już tłumaczę o co chodzi. Dane: (IMG:http://imageshack.com/a/img827/9602/ncvm.jpg) Zadanie: Wyszukaj pracowników zarabiających najmniej na danym etacie. Rozwiązanie, którego bym oczekiwał i uważam za eleganckie powinno mieć postać: SELECT nazwisko FROM pracownicy WHERE ( Etat , Placa_pod ) IN (SELECT Etat, MIN(Placa_pod) FROM pracownicy GROUP BY etat); Niestety nie działa ono na MS SQL. Rozwiązanie, które działa ale jest wg. mnie gorsze (nieeleganckie) ma postać: SELECT dbo.Pracownicy.Nazwisko, dbo.Pracownicy.Imie FROM dbo.Pracownicy INNER JOIN (SELECT MIN(Placa_Pod) AS Min, Etat FROM dbo.Pracownicy AS Pracownicy_1 GROUP BY Etat) AS P_1 ON dbo.Pracownicy.Placa_Pod = P_1.Min AND dbo.Pracownicy.Etat = P_1.Etat Czy któryś z szanownych forumowiczów ma pomysł na rozwiązanie bez użycia JOIN ? Z góry dziękuję Morf. Witam ponownie, po nocnych przemyśleniach: SELECT Nazwisko, Imie FROM dbo.Pracownicy AS T1 WHERE (Placa_Pod = (SELECT MIN(Placa_Pod) AS Low FROM dbo.Pracownicy WHERE (Etat = T1.Etat))) Poziom elegancji 7 / 10 i dodatkowy punkcik za bark JOIN czyli 8 /10 :-) w zasadzie jest OK chyba, że... Pozdrawiam Morf |
|
|
|
![]() |
Post
#2
|
|
|
Grupa: Zarejestrowani Postów: 8 Pomógł: 1 Dołączył: 12.03.2014 Ostrzeżenie: (0%)
|
Zrób tak - na początku każdego zapytania DBCC DROPCLEANBUFFERS (serwer testowy (IMG:style_emoticons/default/exclamation.gif) !!), czasy obliczaj na podstawie zmiennych typu datetime2 (start i end).
Będzie to samo (IMG:style_emoticons/default/smile.gif) lub na granicy błędy statystycznego. Poza tym jak uruchoamiasz dwie kwerendy i porównujesz % udział w barchu to po każdej daj GO. Ewentualnie w swoich testach odwrtóć kolejność zapytań (IMG:style_emoticons/default/smile.gif) Poza tym obejrzyj statystyki odczytów - SET STATISTICS IO ON - identyczne. Jeśli plany są identyczne (wraz z predykatami), statystyki odczytów też to nie ma co drążyć dalej tematu - zapytania wykonywane są przez silnik w taki sam sposób - tak też właśnie jest w tym przypadku. Na koniec jeszcze raz polecam dodanie indeksu
Ten post edytował juris 17.03.2014, 09:16:56 |
|
|
|
Morfina (Nie)Eleganckie zapytanie tablicowe. 27.02.2014, 09:44:21
thek Nie pamiętam czy pod MSSQL to działa, ale czy aby ... 3.03.2014, 10:40:03
fizzlebubble Lekko przyofftopuję... Coś te dane wyglądają znajo... 3.03.2014, 10:50:06
widmo_91 Cytat(thek @ 3.03.2014, 10:40:03 ) Ni... 3.03.2014, 10:53:24
Morfina Cytat(fizzlebubble @ 3.03.2014, 10:50... 4.03.2014, 13:16:04
pmir13 Po raz pierwszy słyszę by ktoś uznawał rozwiązanie... 4.03.2014, 15:14:03
juris Nie ma co gdybać co jest bardzie a co mniej wydajn... 12.03.2014, 09:16:34
Morfina Cytat(pmir13 @ 4.03.2014, 15:14:03 ) ... 13.03.2014, 16:41:32
juris Masz jakieś indeksy na tej tabeli? Możesz podrzuci... 14.03.2014, 09:12:05
Morfina Cytat(juris @ 14.03.2014, 09:12:05 ) ... 15.03.2014, 08:34:13
mmmmmmm Różnica w czasach może wynikać ze statystyk i cach... 15.03.2014, 14:09:16
pmir13 Z odpowiednimi indeksami rozwiązanie klasyczne jes... 28.03.2014, 14:22:54
juris @pmir13 Bardzo mi się podoba Twoje podejście i to ... 31.03.2014, 09:07:51
Morfina Dziękuję wszystkim uczestniką dyskusji, muszę przy... 3.04.2014, 09:06:36 ![]() ![]() |
|
Aktualny czas: 11.10.2025 - 17:08 |