Encontrar clientes que cumplen todos los requisitos
Exprese todos los requisitos con NOT EXISTS, controle conjuntos vacíos y duplicados y distinga inclusión de coincidencia exacta.
Encontrar clientes con algún requisito es sencillo mediante un join. Encontrar clientes que cumplen todos es otra pregunta: una coincidencia demuestra presencia, no integridad del conjunto. La diferencia importa en permisos, certificaciones, paquetes de productos y preparación de migraciones.
Expresar todos como ninguno ausente
Conserve al cliente cuando no exista un requisito faltante. El NOT EXISTS exterior busca una exigencia incumplida. El interior comprueba si falta esa capacidad concreta del cliente. Cada negación corresponde a una condición de negocio identificable.
CREATE TABLE #Customers(CustomerId int PRIMARY KEY);
CREATE TABLE #Required(Capability varchar(10) PRIMARY KEY);
CREATE TABLE #Has(CustomerId int,Capability varchar(10),
PRIMARY KEY(CustomerId,Capability));
INSERT #Customers VALUES(1),(2),(3);
INSERT #Required VALUES('A'),('B');
INSERT #Has VALUES(1,'A'),(1,'B'),(1,'C'),(2,'A');
SELECT c.CustomerId FROM #Customers AS c
WHERE NOT EXISTS
(SELECT 1 FROM #Required AS r WHERE NOT EXISTS
(SELECT 1 FROM #Has AS h WHERE h.CustomerId=c.CustomerId
AND h.Capability=r.Capability))
ORDER BY c.CustomerId;
El cliente 1 cumple A y B; el extra C no lo descalifica. Al cliente 2 le falta B y el 3 no tiene capacidades. Las claves primarias garantizan una aparición por pertenencia y requisito.
La consulta de faltantes explica el resultado. Convierte un sí o no en una lista de acciones. Para operaciones suele ser más útil que un porcentaje con denominador desconocido.
SELECT c.CustomerId,r.Capability AS MissingCapability
FROM #Customers AS c CROSS JOIN #Required AS r
WHERE NOT EXISTS(SELECT 1 FROM #Has AS h
WHERE h.CustomerId=c.CustomerId AND h.Capability=r.Capability)
ORDER BY c.CustomerId,r.Capability;
Definir el conjunto vacío
Sin requisitos, la primera consulta devuelve todos los clientes: no falta ninguna exigencia. Es el significado lógico habitual, pero un proceso puede exigir configuración antes de aprobar. Añada entonces una comprobación EXISTS separada sobre los requisitos, manteniendo explícita esa regla.
Todos los requisitos tampoco equivale a exactamente los requisitos. El cliente 1 pasa a pesar de C. Para coincidencia exacta, agregue otra prueba que rechace capacidades fuera del conjunto requerido. Un extra puede ser inocuo o descalificador; decídalo antes de usar el resultado para permisos.
Evite identificadores NULL sin semántica definida. La igualdad no hace coincidir dos NULL como dos códigos conocidos. Rechace o concilie valores desconocidos antes de evaluar requisitos, en vez de contarlos implícitamente como satisfechos.
Comparar alternativas equivalentes
GROUP BY con COUNT(DISTINCT Capability) también funciona si cuenta exclusivamente capacidades requeridas y compara con el número correcto de exigencias. Contar todas las capacidades es incorrecto: dos capacidades cualesquiera no satisfacen dos concretas. Los duplicados también inflan COUNT si no existe unicidad.
La clave cliente-capacidad favorece comprobaciones específicas. Un índice complementario capacidad-cliente puede ayudar cuando la búsqueda parte de pocos requisitos. Mida beneficio frente a coste de escritura y almacenamiento. Examine planes reales con volúmenes representativos: NOT EXISTS anidados no obligan a bucles procedimentales anidados.
Si requisitos o pertenencias cambian durante la evaluación, defina una vista consistente para decisiones reproducibles. Guarde la versión de reglas con la aprobación cuando deba explicar posteriormente su fundamento. Una consulta actual no reconstruye una decisión de ayer después de cambiar requisitos.
Pruebe conjunto vacío, ausencia de pertenencias, coincidencia exacta, elemento faltante, extras y duplicados rechazados. Compruebe que diagnóstico y decisión usan la misma versión de reglas; de lo contrario pueden contradecirse aunque cada consulta sea correcta individualmente. Añada un cliente con suficientes capacidades irrelevantes para demostrar que no pasa por una simple igualdad de cantidades. El resultado debe seleccionar correctamente y explicar los faltantes sin confundir alguno, todos y exactamente.
Referencias técnicas: Microsoft Learn: EXISTS · Microsoft Learn: COUNT.