Der*_*sar 8 sql-server t-sql sql-server-2012 where
我有一个使用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])
Run Code Online (Sandbox Code Playgroud)
我希望更改的部分是WHERE
子句,而是允许我使用表,这样如果我必须添加要忽略的客户编号,我就不必更新我的所有查询。(并且有相当多的查询具有相同的WHERE
子句。)
CREATE TABLE dbo.CustomerExclusions
(
CustomerNumber VARCHAR(32) PRIMARY KEY -- Is CustomerNumber *really* a string?
);
INSERT dbo.CustomerExclusions(CustomerNumber) VALUES('1234'),('5678');
Run Code Online (Sandbox Code Playgroud)
现在,您WHERE
跨所有查询的子句变为:
WHERE NOT EXISTS
(
SELECT 1 FROM dbo.CustomerExclusions AS c
WHERE c.CustomerNumber = SearchHistory.CustomerNumber
)
Run Code Online (Sandbox Code Playgroud)
创建一个表来保存要排除的客户编号,然后NOT EXISTS
在WHERE
子句中使用 a 排除这些行。
CREATE TABLE dbo.ExcludedCustomers
(
CustomerNumber VARCHAR(255) NOT NULL
CONSTRAINT PK_ExcludedCustomers
PRIMARY KEY CLUSTERED
);
INSERT INTO dbo.ExcludedCustomers (CustomerNumber)
VALUES ('1234')
, ('5678');
SELECT
<....>
FROM [DB].[dbo].[SearchHistory]
WHERE
NOT EXISTS (
SELECT 1
FROM dbo.ExcludedCustomers ec
WHERE ec.CustomerNumber = SearchHistory.CustomerNumber
)
<...>;
Run Code Online (Sandbox Code Playgroud)
归档时间: |
|
查看次数: |
1168 次 |
最近记录: |