0

我有一个表,我在其中存储具有 Created_On 日期和 Last_Updated_On 日期的记录。每条新记录都将使用 Created_On 写入,并且每次后续更新都会使用相同的 Created_On 写入一个新行,但更新的是 Last_Updated_On。

我正在尝试设计一个查询以返回每个查询的最新行。我所拥有的看起来像这样:

SELECT 
   t1.[id] as id,
   t1.[Store_Number] as storeNumber,
   t1.[Date_Of_Inventory] as dateOfInventory,
   t1.[Created_On] as createdOn,
   t1.[Last_Updated_On] as lastUpdatedOn
FROM [UserData].[dbo].[StoreResponses] t1 
JOIN (
      SELECT 
         [Store_Number], 
         [Date_Of_Inventory], 
         MAX([Created_On]) co, 
         MAX([Last_Updated_On]) luo 
      FROM [UserData].[dbo].[StoreResponses] 
      GROUP BY [Store_Number],[Date_Of_Inventory]) t2
   ON 
      t1.[Store_Number] = t2.[Store_Number] 
      AND t1.[Created_On] = t2.co 
      AND t1.[Last_Updated_On] = t2.luo 
      AND t1.[Date_Of_Inventory] = t2.[Date_Of_Inventory]
WHERE t1.[Store_Number] = 123 
ORDER BY t1.[Created_On] ASC

子选择工作正常...我看到 X 行,按 Store_Number 和 Date_Of_Inventory 分组,其中一些的 luo (Last_Updated_On) 值为 NULL。但是,子选择中 luo 为空的那些行不会出现在整体结果中。换句话说,我在子选择中得到 6 个结果,我在整体结果中只得到 2 个,而且只有 Last_Updated_On 不为 NULL 的那些行。

因此,作为测试,我写了以下内容:

SELECT 1 WHERE NULL = NULL

并没有得到任何结果,但是,当我运行时:

SELECT 1 WHERE 1 = 1

我得到了 1 的结果。好像 SQL Server 没有将 NULL 与 NULL 相关联。

我怎样才能解决这个问题?当两个值都为 NULL 时,为什么两个字段不进行比较?

4

3 回答 3

1

默认情况下不启用 ANSI Null 比较;NULL 不等于 NULL。您可以通过提示启用此功能(如果您的业务案例和 NULL 的数据库设计使用需要此功能):

SET ansi_nulls off

另一种基本的转身使用:

ON ((t1.[Store_Number] = t2.[Store_Number])  OR 
(t1.[Store_Number] IS NULL AND t2.[Store_Number] IS NULL))

执行你的 POC:

SET ansi_nulls off
SELECT 1 WHERE NULL = NULL

回报:

1
于 2012-12-29T00:00:35.470 回答
1

您可以使用 Coalesce(假设 Store_Number 是整数的示例)

   ON 
      Coalesce(t1.[Store_Number],0) = Coalesce(t2.[Store_Number],0) 
于 2012-12-29T00:47:28.037 回答
1

这也有效:

AND EXISTS (SELECT t1.Store_Number INTERSECT SELECT t2.Store_Number)
于 2012-12-29T00:56:40.117 回答