2011-08-03 17 views
17
  1. Czy jest możliwe zgodnie ze standardowym (!) SQL?
  2. Jakie minimalne zmiany powinny być konieczne, aby być zgodnym ze standardem (jeśli jeszcze nie było)?
  3. Działa zgodnie z oczekiwaniami w MySQL, iff pierwszy wiersz ma maksymalną wartość dla NumberOfPages.

SELECT * FROM Book HAVING NumberOfPages = MAX(NumberOfPages)MAJĄC BEZ GRUPY PRZEZ

opisana w normie następujące:

HAVING <search condition>

  • Niech G będzie zestaw składający się z każdej kolumnie wskazywanym przez odniesienie < kolumnowej> zawarte w grupę < według klauzuli >.
  • Każde odwołanie do kolumny bezpośrednio zawarte w stanie < wyszukiwania> jest jeden z następujących:
    1. jednoznaczne odniesienie do kolumny, która jest funkcjonalnie zależne G.
    2. Zewnętrzna odniesienia.

source

Czy ktoś mógłby mi wyjaśnić, dlaczego it should be possible według normy?

W MySQL idealnie działa.

+0

Jakiego innego DB próbujesz? Oracle, MSSQL itp? – Fermin

Odpowiedz

2

od standardu (pogrubienie z naciskiem)

1) umożliwiają HC być HAVING. Niech TE będzie wyrażeniem tabeli, które natychmiast zawiera HC. Jeśli TE nie zawiera od razu klauzuli group by, to "GROUP BY()" jest niejawne. Niech T będzie deskryptorem tabeli zdefiniowanej przez GBC zawarty bezpośrednio w TE i niech R będzie wynikiem GBC.

W przypadku niejawnej klauzuli group by zewnętrzne odwołanie może uzyskać dostęp do kolumn TE.

Jednak certyfikacja tych standardów jest w dużej mierze obecnie zaświadczeniem o samocertyfikacji, a podany przykład nie działałby u wszystkich głównych dostawców usług RDBMS.

14

Pomimo wyniku Mimer Validator, nie wierzę, że Twój jest prawidłowy Standard SQL.

Klauzula o klauzuli HAVING bez klauzuli GROUP BY jest poprawna i (prawdopodobnie) użyteczna w składni w standardowym języku SQL. Ponieważ operacja na wyrażeniu tabelowym all-at-once w zestawie, że tak powiem, to naprawdę ma sens używanie funkcji agregujących. W przykładzie:

Book HAVING NumberOfPages = MAX(NumberOfPages) 

nie jest ważna, ponieważ rozważając całą tabelę, co rząd robi NumberOfPages patrz?Podobnie, sensowne jest używanie wartości literalnych w klauzuli SELECT.

Rozważmy następujący przykład, który jest ważny SQL standard:

SELECT 'T' AS result 
    FROM Book 
HAVING MIN(NumberOfPages) < MAX(NumberOfPages); 

Mimo braku kluczowych DISTINCT, zapytanie nie zwróci więcej niż jeden wiersz. Jeśli zostanie spełniona klauzula HAVING, wynik będzie pojedynczym wierszem z pojedynczą kolumną zawierającą wartość "T" (wskazującą, że mamy książki o różnej liczbie stron), w przeciwnym razie wynikiem będzie pusty zbiór, tj. Zero wierszy z pojedynczym kolumna.

myślę powód kwerenda nie błąd w MySQL jest spowodowane propritary rozszerzeń, które powodują klauzuli HAVING do (logicznie) powstać po klauzuli SELECT (zachowanie standardowe jest na odwrót), w połączeniu z niejawna klauzula GROUP BY wspomniana w innych odpowiedziach.

Powiązane problemy