Ich habe eine Abfrage, die eine WHERE
Klausel verwendet, und ich verwende zufällig genau dieselbe WHERE
Klausel in vielen Abfragen in dieser Tabelle (et al.).
Die Abfrage lautet:
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])
Der Teil, den ich ändern möchte, ist die WHERE
Klausel, mit der ich stattdessen eine Tabelle verwenden kann, sodass ich nicht alle meine Abfragen aktualisieren muss, wenn ich eine Kundennummer hinzufügen muss, die ignoriert werden soll. (Und es gibt einige Abfragen, die dieselbe WHERE
Klausel haben.)
sql-server
sql-server-2012
t-sql
where
Der Kommissar
quelle
quelle
Antworten:
Erstellen Sie eine Tabelle, in der die auszuschließenden Kundennummern enthalten sind, und schließen Sie diese Zeilen dann mit a
NOT EXISTS
in derWHERE
Klausel aus.quelle
Jetzt wird Ihre
WHERE
Klausel über alle Abfragen hinweg:quelle
Es gibt wichtige Fragen / mögliche Probleme mit Ihrem vorgeschlagenen Ansatz. Natürlich können Sie über eine Arbeitstabelle zum Ausschluss von Kundennummern einfach genug ausschließen:
Was nun "Abfrageparameter" waren - vollständig dynamisch und unabhängig, pro Abfrage und pro Benutzer - wird nun zu einem "gemeinsam genutzten persistenten Status in der Datenbank".
Einige Fragen und relevante Punkte:
Sollten die Kundenausschlussinformationen separat sein, pro Benutzer oder pro Sitzung? Sie können einen 'SessionID'-Parameter hinzufügen, um diese zu unterscheiden, aber im Wesentlichen erstellen Sie ein altes "Arbeitstabellen" -Muster neu.
Vielleicht könnte eine NOT IN (...) Klausel vorzuziehen sein? das kann dynamisch bis zur Grenze von 2100 Parametern parametriert werden.
Besuchen Sie möglicherweise Ihren Code / Ihre Infrastruktur erneut, um Abfragen und Bindungsparameter zu erstellen, wenn Sie sich derzeit auf feste Parameternummern verlassen. Durch diese Verbesserung wird die Modularität und Verwendung von IN- oder NOT IN-Klauseln (?,?,? ..) mit variabler Anzahl von Parametern ermöglicht.
Vorgeschlagener Ansatz:
Mit Bindungen '1234', '5678', '6789' usw. an die NOT IN () -Parameter und nachfolgenden logischen Abfrageparametern, die dynamisch an die entsprechende Nummerierung gebunden sind.
quelle