Tengo una consulta que usa una WHEREcláusula, y resulta que uso exactamente la misma WHEREcláusula en muchas consultas en esta tabla (et al).
La consulta es:
SELECT
DATENAME(DW, [AtDateTime]) AS [Day of Week]
,COUNT(*) AS [Number of Searches]
,CAST(CAST(COUNT(*) AS DECIMAL(10, 2))
/ COUNT(DISTINCT CONVERT(DATE, [AtDateTime])) AS DECIMAL(10, 2))
AS [Average Searches per Day]
,SUM(CASE WHEN [NumFound] = 0 THEN 1 ELSE 0 END)
AS [Number of Searches with no Results]
,CAST(CAST(SUM(CASE WHEN [NumFound] = 0 THEN 1 ELSE 0 END)
AS DECIMAL(10, 2)) / COUNT(*) AS DECIMAL(10, 4))
AS [Percent of Searches with no Results]
FROM [DB].[dbo].[SearchHistory]
WHERE
[CustomerNumber] <> '1234' AND [CustomerNumber] <> '5678'
GROUP BY DATENAME(DW, [AtDateTime]), DATEPART(DW, [AtDateTime])
ORDER BY DATEPART(DW, [AtDateTime])
La parte que deseo cambiar es la WHEREcláusula, para permitirme usar una tabla de manera que si tengo que agregar un número de cliente para ser ignorado, no tenga que actualizar todas mis consultas. (Y hay bastantes consultas que tienen esta misma WHEREcláusula).
sql-server
sql-server-2012
t-sql
where
Der Kommissar
fuente
fuente

Respuestas:
Cree una tabla para contener los números de clientes que se excluirán, luego excluya esas filas usando a
NOT EXISTSen laWHEREcláusula.fuente
Ahora su
WHEREcláusula en todas las consultas se convierte en:fuente
Hay preguntas importantes / problemas potenciales con su enfoque propuesto. Por supuesto, puede excluir fácilmente a través de una tabla de trabajo 'Exclusión de número de cliente':
Pero ahora, lo que eran "parámetros de consulta" - completamente dinámicos e independientes, por consulta y por usuario - se están convirtiendo en "estado persistente compartido en la base de datos".
Algunas preguntas y puntos relevantes:
¿La información de exclusión del cliente debe ser separada, por usuario o por sesión? puede agregar un parámetro 'SessionID' para distinguirlos, pero esencialmente está recreando un viejo patrón de "Tabla de trabajo".
quizás una cláusula NOT IN (...) podría ser preferible? que se puede parametrizar dinámicamente, hasta el límite de 2100 parámetros.
quizás vuelva a visitar su código / infraestructura para crear consultas y enlazar parámetros, si actualmente confía en números de parámetros fijos; mejorar esto permitirá la modularidad y el uso de cláusulas IN o NOT IN (?,?,? ..) con un número variable de parámetros.
Enfoque sugerido:
Con los enlaces '1234', '5678', '6789', etc. a los parámetros NOT IN () y parámetros de consulta lógica posteriores vinculados dinámicamente a la numeración adecuada.
fuente