Eu tenho uma consulta que usa uma WHERE
cláusula e, por acaso, use exatamente a mesma WHERE
cláusula em muitas consultas nesta tabela (et al).
A consulta é:
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])
A parte que desejo alterar é a WHERE
cláusula, que permite que eu use uma tabela para que, se for necessário adicionar um número de cliente a ser ignorado, não seja necessário atualizar todas as minhas consultas. (E existem algumas consultas que possuem essa mesma WHERE
cláusula.)
sql-server
sql-server-2012
t-sql
where
Der Kommissar
fonte
fonte
Respostas:
Crie uma tabela para manter os números de clientes a serem excluídos e exclua essas linhas usando a
NOT EXISTS
naWHERE
cláusulafonte
Agora sua
WHERE
cláusula em todas as consultas se torna:fonte
Existem questões importantes / problemas em potencial com sua abordagem proposta. Com certeza, você pode excluir facilmente com uma tabela de trabalho 'Exclusão de número de cliente':
Mas agora, o que eram "parâmetros de consulta" - totalmente dinâmicos e independentes, por consulta e por usuário - estão se transformando em "estado persistente compartilhado no banco de dados".
Algumas perguntas e pontos relevantes:
as informações de exclusão do cliente devem ser separadas, por usuário ou por sessão? você pode adicionar um parâmetro 'SessionID' para distingui-los, mas essencialmente você está recriando um antigo padrão "Tabela de trabalho".
talvez uma cláusula NOT IN (...) possa ser preferível? que podem ser parametrizados dinamicamente, até o limite de 2100 parâmetros.
talvez revisite seu código / infraestrutura para criar parâmetros de consultas e vinculações, se você atualmente depende de números de parâmetros fixos; melhorar isso permitirá modularidade e uso de uma cláusula IN ou NOT IN (?,?,? ..) com número variável de parâmetros.
Abordagem sugerida:
Com as ligações '1234', '5678', '6789' etc, para os parâmetros NOT IN () e os parâmetros de consulta lógica subsequentes vinculados à numeração apropriada dinamicamente.
fonte