Optymalizacja zapytania z union all

0

Hej,
przepraszam za głupie pytanie. Niestety popełniłem gafę w pracy i chyba się ośmieszyłem.
Niemniej walczę z pewnym query i nie wiem jak go napisać lepiej?? Chodzi o to że dwa razy odwołuję się do tej samej tabeli i selectem i chcę pobrać inne wiersze.
Skorzystałem z Union All ponieważ wydawło mi się to najszybszym rozwiązaniem, a czuję że to błąd.

UserID UserName
1 Krzysiek
2 Karol
3 JAN
4 Marek
5 Filip
6 Robert

Napisałem taki kod:

SELECT UserName as [Name], UserId as [id]
FROM tabelaA
Where UserName = "Krzysiek"
UNION ALL
SELECT UserName as [Name], UserId as [id]
FROM tabelaA
Where  UserName = @podajinneImięWtymMiejscu

Nie wiem jak powienienem napisać takie zapytanie lepiej?
Czy jednak skorzystać tu z self joina?
Co zrobiłem źle?

Sam wynik jest poprawny i nie trzeba go zmieniać

przykładowy wynik

UserID UserName
1 Krzysiek
5 Filip
8

A nie lepiej użyć IN? WHERE UserName IN....

0
lion137 napisał(a):

A nie lepiej użyć IN? WHERE UserName IN....

Jeżeli świadomie użył UNION ALL, to wynik będzie inny od 'IN'. ALL zwróci powtórzenia, IN nie.

2

Nie jestem przekonany, że wiesz co to zapytanie robi, więc napiszę to, co mi się wydaje, że powinno robić...

SELECT UserName as [Name], UserId as [id] FROM tabelaA WHERE UserName = "Krzysiek" or UserName = "Filip"

Można podmienić trochę składnię dla czytelności:

SELECT UserName as [Name], UserId as [id] FROM tabelaA WHERE UserName IN ("Krzysiek", "Filip")

Powyższe zapytania są tożsame, ale mają inny sens niż to co napisałeś. Różnica objawi się, gdy imiona z obu zapytań będą takie same. W mojej wersji rekordy zostaną zwrócone raz. W twojej wersji dostaniesz powtórzenia, bo UNION ALL, w przeciwienstwie do UNION jedynie głupio skleja wyniki obu zapytań.
Technicznie, nie należy używać UNION, jeżeli można tego uniknąć (czasami struktura bazy jest zrąbana i jednak trzeba), bo optymalizator zapytań po stronie bazy zwykle nie skuma, że można dokonać takiego skrótu jak wyżej i zamiast wykonać jedno proste zapytanie wykona 2 a później jeszcze musi to skleić.

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.