niedziela, 7 września 2008

kombinacja UNION i ORDER BY w Firebird

Dziś miałem problem z kombinacją UNION i ORDER BY w bazie danych Firebird.
Zupełnie nie rozumiałem dlaczego występuje błąd i zapytanie postaci (tylko przykład):
SELECT
TABELA1.KOLUMNA
FROM
TABELA1
WHERE
TABELA1.INNA_KOLUMNA > 10
UNION
SELECT
TABELA1.KOLUMNA
FROM
TABELA1
WHERE
TABELA1.INNA_KOLUMNA < 50
ORDER BY TABELA1.KOLUMNA

zwraca mi błąd:
Invalid command invalid ORDER BY clause

Poszperałem po google i okazało się, że w kombinacji UNION z ORDER BY nie można używać nazw kolumn bezpośrednio tylko trzeba podać numer wg której z kolei kolumny wynikowej ma być posortowana tabela.
Czyli poprawne zapytanie ma postać:
SELECT
TABELA1.KOLUMNA
FROM
TABELA1
WHERE
TABELA1.INNA_KOLUMNA > 10
UNION
SELECT
TABELA1.KOLUMNA
FROM
TABELA1
WHERE
TABELA1.INNA_KOLUMNA < 50
ORDER BY 1

Nie wiem dlaczego tak jest, nie wnikałem. Ale warto wiedzieć, gdyż czasem UNION się przydaje ;)

2 komentarze:

  1. Faktycznie działa! Miałem ten sam problem w Firebird.

    OdpowiedzUsuń
  2. jest tak gdyż order by działa na poziomie kolumn utworzonych na podstawie dwóch i więcej tabel, więc nie może sortowac tylko po jednej, a w założeniu union nazwy kolumn mogą się nawet różnić (a przechowują tą samą wartość), więc sortujemy po nr kolumny, jeśli by się dało w union nadać aliasy dla pierwszej, drugiej itd. kolumny wtedy można by było sortować po nazwie tego aliasa

    OdpowiedzUsuń