Tengo una consulta que usa una WHERE
cláusula, y resulta que uso exactamente la misma WHERE
clá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 WHERE
clá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 WHERE
clá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 EXISTS
en laWHERE
cláusula.fuente
Ahora su
WHERE
clá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