为什么某些 Where 子句被忽略了?
Why is some of the Where clause being ignored?
我有这个table:
CREATE TABLE [dbo].[Handshake]
(
[Report Year] [varchar](100) NULL,
[Status] [varchar](100) NULL,
[Update Time] [datetime] NULL,
[Process Time] [datetime] NULL
) ON [PRIMARY]
GO
一些示例数据:
Report Year Status Update Time Process Time
----------------------------------------------------------------
Test Loading 2020-09-22 12:53:41.417 NULL
2020 1+7 Loaded 2020-09-22 12:46:41.417 NULL
2020 2+7 Loaded 2020-09-21 21:18:25.130 NULL
我有以下程序:
DECLARE
@ReportYearCmd VARCHAR(1000),
@CosCountCmd VARCHAR(1000),
@FranchiseCountCmd AS VARCHAR(1000),
@ProductCountCmd AS VARCHAR(1000);
WITH Validations AS
(
SELECT TOP 1 *
FROM [Handshake]
WHERE [Status] <> 'Loading'
AND [Update Time] = (SELECT MAX([Update Time]) FROM Handshake)
)
UPDATE Validations
SET @ReportYearCmd = CASE
WHEN Report_Year_Count = 0
THEN NULL
ELSE 'SELECT DISTINCT [Report Year] AS [Report Year] FROM [Fact] WHERE NOT EXISTS ( SELECT * FROM [Report Year] WHERE [Report Year].[Report Year] = [Fact].[Report Year] );'
END,
@CosCountCmd = CASE
WHEN COS_Count = 0
THEN NULL
ELSE 'SELECT DISTINCT [Country Code] AS [COS - Country Code] FROM [Fact] WHERE NOT EXISTS ( SELECT * FROM [COS] WHERE [COS].[Country Code] = [Fact].[Country Code] );'
END,
@FranchiseCountCmd = CASE WHEN Franchise_Count = 0 THEN NULL
ELSE 'SELECT DISTINCT [Style Code] AS [Franchise - Style Code] FROM [Fact] WHERE NOT EXISTS ( SELECT * FROM [Franchise] WHERE [Franchise].[Style Code] = [Fact].[Style Code] );'
END,
@ProductCountCmd = CASE WHEN Product_Count = 0 THEN NULL
ELSE 'SELECT DISTINCT [Style Code] AS [Product - Style Code] FROM [Fact] WHERE NOT EXISTS ( SELECT * FROM [Product] WHERE [Product].[Style Code] = [Fact].[Style Code] );'
END,
[Status] = CASE
WHEN ( Report_Year_Count = 0 AND COS_Count = 0 AND Franchise_Count = 0 AND Product_Count = 0 ) THEN 'Good'
ELSE 'Rejects'
END
FROM
[Validations]
OUTER APPLY
(SELECT
ISNULL((SELECT COUNT(*) FROM [Fact]
WHERE NOT EXISTS (SELECT * FROM [Report Year] WHERE [Report Year].[Report Year] = [Fact].[Report Year] ) ), 0 ) AS [Report_Year_Count],
ISNULL( ( SELECT COUNT(*) FROM [Fact] WHERE NOT EXISTS ( SELECT * FROM [COS] WHERE [COS].[Country Code] = [Fact].[Country Code] ) ), 0 ) AS [COS_Count],
ISNULL( ( SELECT COUNT(*) FROM [Fact] WHERE NOT EXISTS ( SELECT * FROM [Franchise] WHERE [Franchise].[Style Code] = [Fact].[Style Code] ) ), 0 ) AS [Franchise_Count],
ISNULL( ( SELECT COUNT(*) FROM [Fact] WHERE NOT EXISTS ( SELECT * FROM [Product] WHERE [Product].[Style Code] = [Fact].[Style Code] ) ), 0 ) AS [Product_Count]
) AS [ValidationCounts];
仅当我不在验证 SELECT 语句中包含此部分时,该过程才有效:...WHERE [Status] <> 'Loading'...
,因此选择最近的更新时间记录,例如
Test Loading 2020-09-22 12:53:41.417 NULL
当我包含 ...WHERE [Status] <> 'Loading'...
时,没有任何反应!
期望:查询应该获取这条记录:
2020 1+7 Loaded 2020-09-22 12:46:41.417 NULL
但它没有...为什么?
SELECT MAX( [Update Time] ) FROM Handshake
的结果是2020-09-2212:53:41.417
现在您的查询是
SELECT TOP 1 * FROM [Handshake] WHERE [Status] <> 'Loading' AND [Update Time] = '2020-09-22 12:53:41.417'
当您评估上述查询时,您会看到没有记录在更新时间 2020-09-22 加载状态 12:53:41.417
正确的查询是
SELECT TOP 1 * FROM [Handshake] h
WHERE [Status] <> 'Loading' AND
[Update Time] = (
SELECT MAX( [Update Time] )
FROM Handshake hi where hi.Status = h.Status)
如果你想要最新的non-loading状态,就不需要子查询了。您可以只在 non-loading 行上使用带有 where
子句的过滤器,然后是 order by
降序日期,并仅保留 tne top (1)
行:
WITH validations AS (
SELECT TOP (1) *
FROM [Handshake]
WHERE [Status] <> 'Loading'
ORDER BY [Update Time] DESC
)
UPDATE validations ...
我有这个table:
CREATE TABLE [dbo].[Handshake]
(
[Report Year] [varchar](100) NULL,
[Status] [varchar](100) NULL,
[Update Time] [datetime] NULL,
[Process Time] [datetime] NULL
) ON [PRIMARY]
GO
一些示例数据:
Report Year Status Update Time Process Time
----------------------------------------------------------------
Test Loading 2020-09-22 12:53:41.417 NULL
2020 1+7 Loaded 2020-09-22 12:46:41.417 NULL
2020 2+7 Loaded 2020-09-21 21:18:25.130 NULL
我有以下程序:
DECLARE
@ReportYearCmd VARCHAR(1000),
@CosCountCmd VARCHAR(1000),
@FranchiseCountCmd AS VARCHAR(1000),
@ProductCountCmd AS VARCHAR(1000);
WITH Validations AS
(
SELECT TOP 1 *
FROM [Handshake]
WHERE [Status] <> 'Loading'
AND [Update Time] = (SELECT MAX([Update Time]) FROM Handshake)
)
UPDATE Validations
SET @ReportYearCmd = CASE
WHEN Report_Year_Count = 0
THEN NULL
ELSE 'SELECT DISTINCT [Report Year] AS [Report Year] FROM [Fact] WHERE NOT EXISTS ( SELECT * FROM [Report Year] WHERE [Report Year].[Report Year] = [Fact].[Report Year] );'
END,
@CosCountCmd = CASE
WHEN COS_Count = 0
THEN NULL
ELSE 'SELECT DISTINCT [Country Code] AS [COS - Country Code] FROM [Fact] WHERE NOT EXISTS ( SELECT * FROM [COS] WHERE [COS].[Country Code] = [Fact].[Country Code] );'
END,
@FranchiseCountCmd = CASE WHEN Franchise_Count = 0 THEN NULL
ELSE 'SELECT DISTINCT [Style Code] AS [Franchise - Style Code] FROM [Fact] WHERE NOT EXISTS ( SELECT * FROM [Franchise] WHERE [Franchise].[Style Code] = [Fact].[Style Code] );'
END,
@ProductCountCmd = CASE WHEN Product_Count = 0 THEN NULL
ELSE 'SELECT DISTINCT [Style Code] AS [Product - Style Code] FROM [Fact] WHERE NOT EXISTS ( SELECT * FROM [Product] WHERE [Product].[Style Code] = [Fact].[Style Code] );'
END,
[Status] = CASE
WHEN ( Report_Year_Count = 0 AND COS_Count = 0 AND Franchise_Count = 0 AND Product_Count = 0 ) THEN 'Good'
ELSE 'Rejects'
END
FROM
[Validations]
OUTER APPLY
(SELECT
ISNULL((SELECT COUNT(*) FROM [Fact]
WHERE NOT EXISTS (SELECT * FROM [Report Year] WHERE [Report Year].[Report Year] = [Fact].[Report Year] ) ), 0 ) AS [Report_Year_Count],
ISNULL( ( SELECT COUNT(*) FROM [Fact] WHERE NOT EXISTS ( SELECT * FROM [COS] WHERE [COS].[Country Code] = [Fact].[Country Code] ) ), 0 ) AS [COS_Count],
ISNULL( ( SELECT COUNT(*) FROM [Fact] WHERE NOT EXISTS ( SELECT * FROM [Franchise] WHERE [Franchise].[Style Code] = [Fact].[Style Code] ) ), 0 ) AS [Franchise_Count],
ISNULL( ( SELECT COUNT(*) FROM [Fact] WHERE NOT EXISTS ( SELECT * FROM [Product] WHERE [Product].[Style Code] = [Fact].[Style Code] ) ), 0 ) AS [Product_Count]
) AS [ValidationCounts];
仅当我不在验证 SELECT 语句中包含此部分时,该过程才有效:...WHERE [Status] <> 'Loading'...
,因此选择最近的更新时间记录,例如
Test Loading 2020-09-22 12:53:41.417 NULL
当我包含 ...WHERE [Status] <> 'Loading'...
时,没有任何反应!
期望:查询应该获取这条记录:
2020 1+7 Loaded 2020-09-22 12:46:41.417 NULL
但它没有...为什么?
SELECT MAX( [Update Time] ) FROM Handshake
的结果是2020-09-2212:53:41.417
现在您的查询是
SELECT TOP 1 * FROM [Handshake] WHERE [Status] <> 'Loading' AND [Update Time] = '2020-09-22 12:53:41.417'
当您评估上述查询时,您会看到没有记录在更新时间 2020-09-22 加载状态 12:53:41.417
正确的查询是
SELECT TOP 1 * FROM [Handshake] h
WHERE [Status] <> 'Loading' AND
[Update Time] = (
SELECT MAX( [Update Time] )
FROM Handshake hi where hi.Status = h.Status)
如果你想要最新的non-loading状态,就不需要子查询了。您可以只在 non-loading 行上使用带有 where
子句的过滤器,然后是 order by
降序日期,并仅保留 tne top (1)
行:
WITH validations AS (
SELECT TOP (1) *
FROM [Handshake]
WHERE [Status] <> 'Loading'
ORDER BY [Update Time] DESC
)
UPDATE validations ...