2011-08-03 21 views
17
  1. ¿Es posible según el estándar (!) SQL?
  2. ¿Qué cambios mínimos deberían ser necesarios para cumplir con la norma (si no lo fue)?
  3. Funciona como se esperaba en MySQL, si la primera fila tiene el valor máximo para NumberOfPages.

SELECT * FROM Book HAVING NumberOfPages = MAX(NumberOfPages)TENIENDO sin GRUPO POR

El siguiente se escribe en la norma:

HAVING <search condition>

  • Sea G el conjunto que consta de cada columna referenciada por una referencia < columna> contenida en el grupo < por la cláusula >.
  • Cada referencia de columna contenida directamente en la condición < búsqueda> será uno de los siguientes:
    1. Una referencia inequívoca a una columna que es funcionalmente dependiente de G.
    2. Una referencia externa.

source

Puede alguien explicar por qué it should be possible de acuerdo con la norma?

En MySQL, funciona perfectamente.

+0

¿En qué otra base de datos está intentándolo? Oracle, MSSQL, etc. – Fermin

Respuesta

2

de la norma (añadido negrita de énfasis)

1) Vamos HC ser la cláusula HAVING. Deje que TE sea la expresión de tabla que contenga inmediatamente HC. Si TE no contiene inmediatamente una cláusula group by, entonces "GROUP BY()" está implícito. Sea T el descriptor de la tabla definida por el GBC contenida inmediatamente en TE y deje que R sea como resultado de GBC.

Con la cláusula by group implícita, la referencia externa puede acceder a las columnas TE.

Sin embargo, la certificación de estos estándares es una autocertificación en estos días, y el ejemplo que usted dio no funcionaría en todos los proveedores principales de RDBMS.

14

A pesar del resultado Mimer Validator, no creo que el suyo sea SQL estándar válido.

Una cláusula HAVING sin una cláusula GROUP BY es válida y (podría decirse) sintaxis útil en SQL estándar. Debido a que opera en la expresión de tabla todo a la vez como un conjunto, por así decirlo, solo tiene sentido usar funciones agregadas. En su ejemplo:

Book HAVING NumberOfPages = MAX(NumberOfPages) 

no es válida porque la hora de considerar a toda la mesa, lo que hace fila NumberOfPages refiere?Del mismo modo, solo tiene sentido usar valores literales en la cláusula SELECT.

Considere este ejemplo, que tiene una validez de SQL estándar:

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

A pesar de la ausencia de la palabra clave DISTINCT, la consulta no volverá más de una fila. Si se cumple la cláusula HAVING, el resultado será una sola fila con una sola columna que contiene el valor 'T' (lo que indica que tenemos libros con diferentes números de páginas), de lo contrario el resultado será el conjunto vacío, es decir, cero filas con un solo columna.

Creo que la razón por qué la consulta no error en MySQL es debido a las extensiones propritary que causan la cláusula HAVING que (lógicamente) llegar a existir después de la cláusula SELECT (el comportamiento estándar es al revés), junto con la cláusula implícita GROUP BY mencionada en otras respuestas.

Cuestiones relacionadas