ejemplos datos consultas complejas agrupadas sql sql-server

consultas - ejemplos de sql en base de datos



Pregunta de consulta SQL: SELECCIONAR... NO EN (7)

Estoy seguro de haber cometido un error tonto, pero no puedo entender qué:

En SQL Server 2005, estoy intentando seleccionar todos los clientes, excepto los que han hecho una reserva antes de las 2 AM.

Cuando ejecuto esta consulta:

SELECT idCustomer FROM reservations WHERE idCustomer NOT IN (SELECT distinct idCustomer FROM reservations WHERE DATEPART ( hour, insertDate) < 2)

Obtengo 0 resultados.

Pero

SELECT idCustomer FROM reservations

devuelve 152,000 resultados y la parte "NO EN":

SELECT distinct idCustomer FROM reservations WHERE DATEPART ( hour, insertDate) < 2

devuelve solo 284 filas


Dado que es SQL 2005, también puedes probar esto. Es similar al comando MINUS de Oracle (opuesto a UNION)

Pero también sugeriría agregar la columna DATEPART (hora, fechaInsertar) para la depuración

SELECT idCustomer FROM reservations EXCEPT SELECT idCustomer FROM reservations WHERE DATEPART ( hour, insertDate) < 2


SELECT Reservations.idCustomer FROM Reservations (nolock) LEFT OUTER JOIN @reservations ExcludedReservations (nolock) ON Reservations.idCustomer=ExcludedReservations.idCustomer AND DATEPART(hour, ExcludedReservations.insertDate) < 2 WHERE ExcludedReservations.idCustomer IS NULL AND Reservations.idCustomer IS NOT NULL GROUP BY Reservations.idCustomer

[Actualización: se agregaron criterios adicionales para manejar idCustomer siendo NULL, que aparentemente era el principal problema que tenía el póster original]


Siempre es peligroso tener NULL en la lista IN ; a menudo se comporta como se espera para el IN pero no para el NOT IN :

IF 1 NOT IN (1, 2, 3, NULL) PRINT ''1 NOT IN (1, 2, 3, NULL)'' IF 1 NOT IN (2, 3, NULL) PRINT ''1 NOT IN (2, 3, NULL)'' IF 1 NOT IN (2, 3) PRINT ''1 NOT IN (2, 3)'' -- Prints IF 1 IN (1, 2, 3, NULL) PRINT ''1 IN (1, 2, 3, NULL)'' -- Prints IF 1 IN (2, 3, NULL) PRINT ''1 IN (2, 3, NULL)'' IF 1 IN (2, 3) PRINT ''1 IN (2, 3)''


Lo siento si me he perdido el punto, pero ¿no haría lo siguiente lo que quiere por sí mismo?

SELECT distinct idCustomer FROM reservations WHERE DATEPART(hour, insertDate) >= 2


SELECT distinct idCustomer FROM reservations WHERE DATEPART ( hour, insertDate) < 2 and idCustomer is not null

Asegúrese de que su parámetro de lista no contenga valores nulos.

Aquí hay una explicación:

WHERE field1 NOT IN (1, 2, 3, null)

es lo mismo que:

WHERE NOT (field1 = 1 OR field1 = 2 OR field1 = 3 OR field1 = null)

  • Esa última comparación se evalúa como nula.
  • Ese nulo está OR con el resto de la expresión booleana, produciendo nulo. (*)
  • null es negado, produciendo nulo.
  • null no es verdadero: la cláusula where solo conserva las filas verdaderas, por lo que todas las filas se filtran.

(*) Editar: esta explicación es bastante buena, pero deseo abordar una cosa para evitar futuros recortes selectivos. (VERDADERO O NULO) evaluaría VERDADERO. Esto es relevante si field1 = 3, por ejemplo. Ese valor VERDADERO sería negado a FALSO y la fila sería filtrada.


SELECT MIN(A.maxsal) secondhigh FROM ( SELECT TOP 2 MAX(EmployeeBasic) maxsal FROM M_Salary GROUP BY EmployeeBasic ORDER BY EmployeeBasic DESC ) A


select * from table_name where id=5 and column_name not in (''sandy,''pandy'');