У меня есть запрос, который использует WHERE
предложение, и я случайно использую одно и то же WHERE
предложение во многих запросах к этой таблице (и др.).
Запрос:
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])
Часть, которую я хочу изменить, - это WHERE
предложение, позволяющее мне вместо этого использовать таблицу, так что, если мне нужно добавить номер клиента, который будет игнорироваться, мне не придется обновлять все мои запросы. (И есть довольно много запросов, которые имеют такое же WHERE
предложение.)
sql-server
sql-server-2012
t-sql
where
Der Kommissar
источник
источник
Ответы:
Создайте таблицу для хранения номеров клиентов, подлежащих исключению, а затем исключите эти строки, используя
NOT EXISTS
вWHERE
предложении.источник
Теперь ваше
WHERE
предложение по всем запросам становится:источник
Есть важные вопросы / потенциальные проблемы с вашим предложенным подходом. Конечно, вы можете легко исключить с помощью рабочей таблицы «Исключение номера клиента»:
Но теперь то, что было «параметрами запроса» - полностью динамическими и независимыми, для каждого запроса и для каждого пользователя - превращается в «общее постоянное состояние в базе данных».
Некоторые вопросы и актуальные вопросы:
должна ли информация об исключении клиента быть отдельной, для каждого пользователя или для каждой сессии? Вы можете добавить параметр 'SessionID', чтобы различать их, но по сути вы воссоздаете старый седой шаблон «Рабочий стол».
возможно, предложение NOT IN (...) может быть предпочтительнее? который может быть параметризован динамически, вплоть до 2100 параметров.
возможно, пересмотрите ваш код / инфраструктуру для создания запросов и привязки параметров, если вы в настоящее время полагаетесь на фиксированные номера параметров; его улучшение позволит использовать модульность и использовать предложения IN или NOT IN (?,?,? ..) с переменным числом параметров.
Предлагаемый подход:
С привязками «1234», «5678», «6789» и т. Д. К параметрам NOT IN () и последующим параметрам логического запроса, динамически привязанным к соответствующей нумерации.
источник